在Haskell中使用'Maybe'值访问记录字段

3
在 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的默认部分,所以我想知道是否有编译器扩展可以实现这一点?或者,我是否可以使用模板自己实现类似的东西?

4
使用记录语法来处理和总和类型是一个很糟糕的做法,如果你想要像你所要求的那样访问和修改器,你需要使用一些模式匹配自己编写它们。话虽如此,因为这是非常简单的样板代码,我相信你可以写一些模板Haskell来自动生成它们。如果有人已经这么做了,我也不会感到惊讶。 - lehins
1个回答

3

不,使用记录选择器无法实现这一操作。要理解其原因,需要记住它们可用于记录更新,而不仅仅是作为函数。如果 x = Empty,那么x { st = "foo" }仍然没有合理的结果。如果您不关心函数实际上是否为记录,则可以使用Template Haskell仅生成所需的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接