我正在测试C程序员的Haskell教程中的示例(第2部分),并且在这个问题上遇到了一些麻烦....
showPet :: Maybe (String, Int, String) -> String
showPet Nothing = "none"
showPet (Just (name, age, species)) = "a " ++ species ++ " named " ++ name ++ ", aged " ++ (show age)
Run Code Online (Sandbox Code Playgroud)
在编译时,使用它进行调用
showPet ("cat",5,"felix")
Run Code Online (Sandbox Code Playgroud)
结果是
<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")
Run Code Online (Sandbox Code Playgroud)
我是不正确地调用它还是在Haskell中进行了更改,这使得需要进行更改(我已经找到了一些)?
Ada*_*ner 10
您在类型中指定showPet
,您的第一个参数应该是类型showPet :: Maybe (String, Int, String)
,但您只提供了一个(String, Int, String)
你需要将你的值"包装"在某个Maybe
值上以使其工作.对于maybes来说这很容易,因为如果你有一个值,你总是会使用Just
(Just
的类型是a -> Maybe a
)
最终的工作结果是, showPet (Just ("cat",5,"felix"))
类型错误告诉您showPet
预期Maybe something
,但您正在传递它something
.
在Haskell中,Maybe
类型是一个显式包装器,它在类型系统中指示可能不存在值.在运行时,缺省由Nothing
值表示,值的存在需要Just
包装器.
所以,你需要调用showPet
带showPet (Just ("cat",5,"felix"))
.
请注意,您调用的方式showPet
与其定义紧密匹配 - 调用的语法与showPet (Just ...
行的语法相匹配.
归档时间: |
|
查看次数: |
7698 次 |
最近记录: |