在Haskell中,如果我创建像这样的数据类型:
data MyT = MyT Int deriving (Show)
myValue = MyT 42
我可以获取将'myValue'传递给函数并进行模式匹配的Int值:
getInt :: MyT -> Int
getInt (MyT n) = n
在我看来,应该可以简化一些事情。还有另一种方法吗?
另外,我尝试了lambda函数:
(\(MyT n) -> n) myValue
它不起作用,我不明白为什么不这样做。
我得到错误:
编辑:
当然,下面的sepp2k关于我的lambda函数正常工作是正确的。我在做:
(\(MyT n) -> n) myT 42
代替
(\(MyT n) -> n) (myT 42)
最佳答案
您可以使用记录语法
data MyT = MyT {unMyT :: Int} deriving (Show)
给你免费的投影
unMyT :: MyT -> Int
如果您的数据类型只有一个构造函数(包括
newtype
),那么这很好。对于涉及多个构造函数的数据类型,投影函数往往是不安全的(例如head
,tail
),并且通常首选模式匹配。如果启用警告,GHC会检查非穷尽模式,并有助于发现错误。