这是我的代码:
NULL
这是我对我在此处所写内容的解释:有一种数据类型data Person = Person {name :: String}
greet :: Person -> String -> String
greet person lastName =
"Hi my name is " ++ name ++ ", last name: " ++ lastName
,其中存在一个返回字符串的方法Person
。
还存在一个函数name
,它接收greet
和Person
并返回不同的String
。但是,greet方法调用String
数据类型的name
方法来连接此字符串。
然而,当我编译此代码时,我收到此错误:
Person
为什么会这样?
答案 0 :(得分:8)
请注意,name
是您从Record语法中免费获得的函数。你可以在ghci
中看到它的类型:
λ> :t name
name :: Person -> String
您收到错误是因为您尝试将++
函数应用于名为name
的函数而不是String
。所以你的代码应该是这样的:
greet :: Person -> String -> String
greet person lastName = "Hi my name is " ++ name person ++ ", last name: " ++ lastName
答案 1 :(得分:4)
@ Sibi的回答是正确的,但是RecordWildCards
你可以接近你的原文:
{-# LANGUAGE RecordWildCards #-}
data Person = Person {name :: String}
greet :: Person -> String -> String
greet Person{..} lastName =
"Hi my name is " ++ name ++ ", last name: " ++ lastName