在 Haskell 中将记录字段作为'Maybe'值访问



在 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来生成你想要的函数。

相关内容

  • 没有找到相关文章

最新更新