首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell无法匹配预期的类型字符?

Haskell无法匹配预期的类型字符?
EN

Stack Overflow用户
提问于 2013-04-24 08:32:59
回答 1查看 4.1K关注 0票数 0

我想要做的是调用一个我已经在输入输出main中创建的函数。im调用的函数是一个高阶函数,如下所示:

代码语言:javascript
复制
filmsByFan' f = map title $ filter (elem f . fans) testDatabase

这是代码的一部分,每当我试图调用这个高阶函数时,它都会发出错误消息:

代码语言:javascript
复制
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

到目前为止,其余的代码运行得很好,即如果用户输入'2‘,它将运行displayAllFilms函数(请注意,displayAllFilms函数不是高阶函数)

是不是因为函数是“高阶”的,所以它会给出这个错误?

代码语言:javascript
复制
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)'

任何帮助都将不胜感激!提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-24 08:51:56

代码语言:javascript
复制
Expected type: String

这意味着在程序的这一点上,ghc希望找到String类型的表达式(因为putStrLn的第一个参数必须是String)。

代码语言:javascript
复制
  Actual type: [Title]

这意味着这里实际找到的表达式(filmsByYear' filmyear)的类型为[Title] (因为filmsByYear'给出的结果是一个[Title])。

如果期望的类型和实际的类型相同,就不会出现错误。

假设你有type Title = String,所以它试图将String[String]统一起来,但失败了。(因为type String = [Char],它试图将[Char][[Char]]统一起来……

解决此问题的可能方法:

  • [String]转换为String,例如使用unlines

putStrLn (unlines (filmsByYear的电影年))

您可能更喜欢使用Data.List中的intercalate,这取决于您希望如何依次对列表中的每个字符串使用list formatted.

  • Call putStrLn,方法是使用mapM_

mapM_ putStrLn (filmsByYear电影年)

注:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16181438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档