无法匹配预期类型`Maybe(String,Int,String)'实际类型`([Char],t0,[Char])'

时间:2014-07-13 00:38:01

标签: haskell ghci

我正在测试Haskell Tutorial for C Programmers (Part 2)中的示例,并且遇到这个问题......

showPet :: Maybe (String, Int, String) -> String
showPet Nothing     = "none"
showPet (Just (name, age, species)) = "a " ++ species ++ " named " ++ name ++ ", aged " ++ (show age)

编译时,用

调用它
showPet ("cat",5,"felix")

结果

<interactive>:131:9:
Couldn't match expected type `Maybe (String, Int, String)'
            with actual type `([Char], t0, [Char])'
In the first argument of `showPet', namely `("cat", 5, "felix")'
In the expression: showPet ("cat", 5, "felix")
In an equation for `it': it = showPet ("cat", 5, "felix")

我是错误地调用它还是Haskell中的更改导致需要更改(我已经找到了一些)?

2 个答案:

答案 0 :(得分:10)

您在showPet类型中指定,您的第一个参数应为showPet :: Maybe (String, Int, String)类型,但您只提供了(String, Int, String)

你需要&#34;包装&#34;您的值在某个Maybe值中可以使其工作。对于maybes来说这很容易,因为如果你有价值,那么你总是只使用JustJust的类型是a -> Maybe a

最终的工作结果为showPet (Just ("cat",5,"felix"))

答案 1 :(得分:8)

类型错误告诉您showPet期望Maybe something,但您传递的是something

在Haskell中,Maybe类型是一个显式包装器,它在类型系统中指示值可能不存在。在运行时缺少由Nothing值表示,值的存在需要Just包装。

因此,您需要使用showPet致电showPet (Just ("cat",5,"felix"))

请注意,您调用showPet的方式与其定义非常匹配 - 调用的语法与showPet (Just ...行的语法匹配。