gpt4 book ai didi

haskell - 为什么在 haskell 中 show 不被视为转换?

转载 作者:行者123 更新时间:2023-12-02 23:49:09 24 4
gpt4 key购买 nike

我仍在努力学习 Haskell,但我注意到一些让我很恼火的事情。

书中"Learn You a Haskell for Great Good!"这一部分展示了在模式匹配中使用守卫,在这本书中,它是一个计算人的体重指数的小函数,它有点像这样(部分稍微改变了,以免侵犯版权或其他什么) :

bmiCalc :: (RealFloat a) => a -> a -> String
bmiCalc weight height
| bmi <= 18.5 = "skinny"
| bmi <= 25.0 = "normal"
| bmi <= 30.0 = "fat"
| otherwise = "obese"
where bmi = weight / height ^ 2

这一切都很好,代码按照广告的那样工作,但我想,如果它还显示它计算出的 bmi 以及文本怎么办?

所以我将代码重写为:

bmiCalc :: (RealFloat a) => a -> a -> String
bmiCalc weight height
| bmi <= 18.5 = "skinny, " ++ show bmi
| bmi <= 25.0 = "normal, " ++ show bmi
| bmi <= 30.0 = "fat, " ++ show bmi
| otherwise = "obese, " ++ show bmi
where bmi = weight / height ^ 2

期望“show”像 java 和 c# 中的 .toString 一样工作
天哪,我错了。

ghci 给了我这个令人讨厌的大错误消息:

Could not deduce (Show a) arising from a use of `show'
from the context (RealFloat a)
bound by the type signature for
bmiCalc :: RealFloat a => a -> a -> String
at file.hs:1:16-48
Possible fix:
add (Show a) to the context of
the type signature for bmiCalc :: RealFloat a => a -> a -> String
In the second argument of `(++)', namely `show bmi'
In the expression: "skinny, " ++ show bmi
In an equation for `bmiCalc':
bmiCalc weight height
| bmi <= 18.5 = "skinny, " ++ show bmi
| bmi <= 25.0 = "normal, " ++ show bmi
| bmi <= 30.0 = "fat, " ++ show bmi
| otherwise = "obese, " ++ show bmi
where
bmi = weight / height ^ 2
Failed, modules loaded: none.

这是为什么呢?为什么它不允许我将似乎返回字符串的内容附加到字符串中?我的意思是,据我所知 "skinny, "++ show bmi 是一个字符串...这正是类型签名所说的我必须返回的内容

那么我在这里做错了什么?

最佳答案

将类型签名更改为:

bmiCalc :: (RealFloat a, Show a) => a -> a -> String

因为您要使用 Show 类型类中的成员函数 show;但您尚未在函数约束中指定这一点,并且 ghci 无法推断其正确性。

关于haskell - 为什么在 haskell 中 show 不被视为转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17374437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com