use*_*649 0 io haskell input output
我想要做的是将我已经创建的函数调用到输入输出main.函数im调用是一个高阶函数,如下所示:
filmsByFan' f = map title $ filter (elem f . fans) testDatabase
Run Code Online (Sandbox Code Playgroud)
每当我尝试调用这个更高阶函数时,这就是吐出错误消息的代码部分:
getInt :: IO Int
getInt = do str <- getLine
return (read str :: Int)
main :: IO ()
main = do putStrLn "Enter 1. Add Film / 2. Display all Films / 3. Display film by Year / 4. Display film by fan / 5. Display film by actor and period / 6. Become Fan: "
str <- getLine
if str == "1"
then do return ()
else if str == "2"
then do putStrLn (displayAllFilms' testDatabase "")
else if str == "3"
then do putStrLn "Enter a film year: "
filmyear <- getInt
putStrLn (filmsByYear' filmyear) <<< **ERROR HERE** (154:47)
else main
Run Code Online (Sandbox Code Playgroud)
代码的其余部分,直到在这里工作很好,也就是说,如果用户输入"2",它将运行displayAllFilms功能(注意displayAllFilms功能不是一个高阶函数)
是因为函数是'高阶'因此它会给出这个错误吗?
Coursework v1.hs:154:47:
Couldn't match expected type `Char' with actual type `[Char]'
Expected type: String
Actual type: [Title]
In the return type of a call of `filmsByYear''
In the first argument of `putStrLn', namely
`(filmsByYear' filmyear)'
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!提前致谢!
Expected type: String
Run Code Online (Sandbox Code Playgroud)
这意味着在程序的这一点上,ghc期望找到一个类型的表达式String(因为第一个参数putStrLn必须是a String).
Actual type: [Title]
Run Code Online (Sandbox Code Playgroud)
这意味着在这里实际找到的表达式ghc (filmsByYear' filmyear)具有类型[Title](因为给出的结果filmsByYear'是a [Title]).
如果预期类型和实际类型相同,则不会出现错误.
想必你有type Title = String,所以它试图统一String与[String]该失败.(而且因为type String = [Char],它是获得尽可能努力统一[Char]与[[Char]]......这仍然失败.)
解决此问题的可能方法:
打开[String]成String,例如使用unlines
putStrLn (unlines (filmsByYear' filmyear))
Run Code Online (Sandbox Code Playgroud)
您可能更喜欢使用intercalateData.List,具体取决于您希望列表格式化的方式.
putStrLn通过使用依次调用列表中的每个字符串mapM_
mapM_ putStrLn (filmsByYear' filmyear)
Run Code Online (Sandbox Code Playgroud)nb既不是高阶函数,putStrLn也不filmsByYear'是高阶函数.