gpt4 book ai didi

haskell - Haskell 中的 RealFloat 类型是做什么用的?

转载 作者:行者123 更新时间:2023-12-04 05:36:46 25 4
gpt4 key购买 nike

向你学习 Haskell 书,有一个关于计算你的BMI的例子。

bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| bmi <= skinny = "You're underweight, you emo, you!"
| bmi <= normal = "You're supposedly normal. Pffft, I bet you're ugly!"
| bmi <= fat = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
where bmi = weight / height ^ 2
(skinny, normal, fat) = (18.5, 25.0, 30.0)

当我尝试自己做这个例子时,我使用了 (Num a) => a -> a -> String作为方法的类型签名。但是,这引发了以下错误:
Could not deduce (Ord a) arising from a use of ‘<=’
from the context (Num a)
bound by the type signature for
bmiTell :: Num a => a -> a -> String
at scratch.hs:96:12-38
Possible fix:
add (Ord a) to the context of
the type signature for bmiTell :: Num a => a -> a -> String

我无法仅使用 Num 解决错误和 Ord类型类。为什么我需要使用 RealFloat typeclass 使这段代码工作? RealFloat 有什么特别之处? Num 未涵盖的内容?

最佳答案

Num还不够,RealFloat对于这个例子来说确实是多余的。 Fractional ,这是 (/) 所必需的, 足够好:

GHCi> :t (/)
(/) :: Fractional a => a -> a -> a

那么,一个合适的签名应该是:
bmiTell :: (Fractional a, Ord a) => a -> a -> String

RealFloat 是浮点类型的类,而 Fractional 涵盖了支持真正划分的所有内容。 DoubleRealFloat (还有一个 Fractional ,因为它是 RealFloat 的父类(super class))。 Ratio有理数类型,可从 Data.Ratio 获得, 是 Fractional 的示例那不是 RealFloat .

另见: Ben's answer ,它考虑了为什么本书可能使用了 RealFloat而不是这里显示的可以说更简单的替代方案。

关于haskell - Haskell 中的 RealFloat 类型是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126865/

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