在 Haskell 中,如果我为具有单个构造函数的类型指定字段名称,编译器应该生成适当的函数MyType -> fieldType
.但是MyType
如果有多个具有不同参数或类型的构造函数,则会分解。我想知道是否有某种方法可以告诉编译器为这些函数提供签名MyType -> Maybe fieldType
。即代替:
data MyType = Empty | Record { st :: String, ui :: Word }
-- where
-- st Empty == undefined
-- ui Empty == undefined
-- I have
data MyType = Empty | Record { st :: String, ui :: Word }
-- where
-- st :: MyType -> Maybe String
-- st Empty = Nothing
-- st (Record s _) = Just s
--
-- ui Empty = Nothing
-- ui (Record _ n) = n
我想避免使用像st Empty
返回undefined
这样的表达式的默认行为,因为如果st Empty
返回Nothing
,我可以使用模式匹配来决定下一步要做什么,而不必在不纯代码中进一步捕获调用堆栈中的异常。我意识到默认情况下这不是 Haskell 的一部分,所以我想知道是否有编译器扩展允许这样做?或者,我可以使用模板自己实现这样的事情吗?
不,没有办法使用记录选择器执行此操作。要了解原因,请记住它们可以用于记录更新,而不仅仅是一个函数。如果x = Empty
,那么x { st = "foo" }
仍然没有什么合理的。如果你不关心函数实际上是记录的,那么你可以使用Template Haskell来生成你想要的函数。