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

问题描述 投票:2回答:1

在Haskell中,如果我使用单个构造函数指定类型的字段名称,则编译器应生成适当的函数MyType -> fieldType。但是,如果MyType具有多个具有不同Ar项或类型的构造函数,则此方法将失效。我想知道是否可以通过某种方式告诉编译器给这些函数签名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的一部分,所以我想知道是否有允许这样做的编译器扩展?或者,我可以使用模板自己实现类似的东西吗?

haskell record ghc template-haskell
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.