从自定义数据类型中获取值

Getting a value from a custom datatype

我在 Haskell 中有一个自定义数据类型。我有一个自定义类型,稍后我想从中获取 属性 并输出它。在 Java 中,我将只使用 . (点)运算符,但这在 Haskell 中不起作用。我该怎么做?

这是我现在的代码

data Person = P Name Address
type Name = String
type Address = String

x :: Person 
x = (P "abc" "def")

y :: Name
y = x.Name

main :: IO ()
main = putStrLn $ "The name is: " ++ y

您可以使用模式匹配:

y = case x of P name _ -> name
y = name where P name _ = x
y = let P name _ = x in name

您可以编写一个字段访问器函数:

name (P n _) = n
y = name x

y = (\(P name _) -> name) x的评论中的建议基本上是这样做的;上面 name 的定义是

的语法糖
name = \(P n _) -> n

一旦其定义被内联,它就会从评论中给出解决方案。

或者您可以使用记录语法重新定义您的类型并让编译器编写您的访问器:

data Person = P
    { name :: Name
    , address :: Address
    }

y = name x

实际上,如果您这样做,我想我可能会省略类型别名。

data Person = P
    { name :: String
    , address :: String
    }

他们只是在重复字段名称中已有的信息,并没有真正让你买账;例如,编译器不会阻止您不小心从一个人那里读取一个名字并将其存储在另一个人的地址中。