haskell定义新类型

时间:2014-02-23 00:06:54

标签: 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.

谢谢!

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

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