2014-02-23 75 views
1

这可能是一个愚蠢的问题,但我已经花了四个小时在我发布之前指出问题所在。haskell定义新类型

data Film = Film {title :: String 
       ,name :: String 
       ,year :: Int} 
    deriving (Show) 
testDatabase :: [Film] 
testDatabase = [ ("Blade Runner", "Ridley Scott",1982)] 
--(i) Add new film to the database 
addFilm :: String -> String -> Int -> [Film] -> [Film] 
addFilm title director year film = film + Film title director year 

--(ii) Give all film in the database 
getFilm :: [Film] 
getFilm = testDatabase 

我想要做的是定义包含一个新的类型名称Film:电影片名,电影导演和制作的一年。
Testdatabase用于存储数据。
addFilm是为数据库添加更多电影的功能。
getfilm用于列印电影列表。

这是错误的样子。

coursework.hs:21:18: 
Couldn't match expected type `Film' 
      with actual type `([Char], [Char], Integer)' 
In the expression: ("Blade Runner", "Ridley Scott", 1982) 
In the expression: [("Blade Runner", "Ridley Scott", 1982)] 
In an equation for `testDatabase': 
    testDatabase = [("Blade Runner", "Ridley Scott", 1982)] 

coursework.hs:24:43: 
Couldn't match expected type `[Film]' with actual type `Film' 
In the return type of a call of `Film' 
In the second argument of `(+)', namely `Film title director year' 
In the expression: film + Film title director year 
Failed, modules loaded: none. 

谢谢!!

回答

6

你的类型

data Film = Film {title :: String 
       ,name :: String 
       ,year :: Int} 

等同于元组类型(String,String,Int),但因为它不一样的。

("Blade Runner", "Ridley Scott",1982) :: (String,String,Int) 

但你要

Film {title = "Blade Runner", name="Ridley Scott",year=1982} :: Film 

你写

addFilm :: String -> String -> Int -> [Film] -> [Film] 
addFilm title director year film = film + Film title director year 

+只适用于数字,而不是列表,我们使用:把新的东西在列表中,因此'!':"Hello""!Hello" ,所以你需要

addFilm :: String -> String -> Int -> [Film] -> [Film] 
addFilm title director year films 
    = Film {title=title,name=director,year=year}:films 

(您应该将函数体与其类型声明对齐,但只要它缩进就可以开始新部分)。

3

您需要使用Film构造函数:[Film "Blade Runner" "Ridley Scott" 1982]。另外,我想你想要:而不是+:的参数也需要与当前的参数进行交换。