2015-06-05 59 views
1

这里的财产是我的代码:访问的数据类型

data Person = Person {name :: String} 

greet :: Person -> String -> String 
greet person lastName = 
    "Hi my name is " ++ name ++ ", last name: " ++ lastName 

这是我的,我在这里写了什么解释:对于其中存在的方法name返回一个数据类型Person串。

还有一个函数greet它需要一个PersonString并返回一个不同的String。但是,问候方法调用Person数据类型的name方法来连接此字符串。

然而,当我编译这段代码,我得到这个错误:

Couldn't match expected type `[Char]' with actual type `Person -> String' 

这究竟是为什么?

回答

8

注意name是你从记录语法免费的功能。你可以看到它的类型ghci

λ> :t name 
name :: Person -> String 

由于你试图++功能应用于一个名为name而不是String功能得到一个错误。所以,你的代码应该是这样的:

greet :: Person -> String -> String 
greet person lastName = "Hi my name is " ++ name person ++ ", last name: " ++ lastName 
4

@思碧的答案是正确的,但RecordWildCards你可以得到接近你的原文:

{-# LANGUAGE RecordWildCards #-} 

data Person = Person {name :: String} 

greet :: Person -> String -> String 
greet Person{..} lastName = 
    "Hi my name is " ++ name ++ ", last name: " ++ lastName 
+0

什么是RecordWildCards? – dopatraman

+0

@dopatraman这是所谓的语言扩展。除Haskell语言规范外,这些是一些语法或行为。它们是编译器特定的,但GHC支持相当数量的编译器。其中一些有助于编写与C库的绑定,一些用于更高级的系统功能,另一些用于扩展语法,如上面的语法。例如,为了让字符串文字也可以作为'Text'或'ByteString',你可以使用'OverloadedStrings'扩展名。有很多有趣的和有用的,但你会在学习Haskell时遇到它们。 – bheklilr