在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),那么这很好。对于涉及多个构造函数的数据类型,投影函数往往是不安全的(例如headtail),并且通常首选模式匹配。如果启用警告,GHC会检查非穷尽模式,并有助于发现错误。

07-26 00:59