【问题标题】:Haskell Double String ConcatenationHaskell 双字符串连接
【发布时间】:2016-05-19 13:34:34
【问题描述】:

我开始使用 Haskell 并创建了以下两个函数:

calcBmi :: ( RealFloat a ) => a -> a -> a -- Accepts two and returns one 'RealFloat' number.
calcBmi w h = w / h ^ (2 :: Integer) -- Stores argument one and two in w and h respectively and evaluates

outputBmi :: (RealFloat a) => a -> a -> String -- Accepts two RealFloats and returns string
outputBmi weight height = let bmi = calcBmi weight height in "Your BMI was calculated to " ++ bmi

当我尝试编译此代码时,出现以下异常

无法将预期类型“[Char]”与实际类型“a”匹配

在'(++)'的第二个参数中,即'bmi'

我对这个错误的含义感到困惑,更不用说如何修复代码以正确编译。我只能假设它与“bmi”变量的类型有关。

如果有人可以帮助初学者,将不胜感激。如果您在代码中发现其他问题(或者如果我使用了错误的术语),请随时告诉我。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    变量不是字符串,因此不能被 (++) 函数使用。通常,您可以使用 show 将其转换为字符串,但是,您的类型并未指定 a 是类 Show 的实例,因此您可能需要添加它,甚至只指定类型直接(即-Float

    例如,您可以更改 calcBmi 的类型

    calcBmi :: Float->Float->Float
    

    calcBmi :: (RealFloat a, Show a)=>a->a->a
    

    然后你可以创建一个字符串如下

    "Your BMI was calculated to " ++ show bmi
    

    【讨论】:

    • 啊,我明白了。是否有理由不使用 calcBmi :: (RealFloat a, Show b)=>a->a->b 来代替您的建议?
    • 看来我还需要将outputBmi :: (RealFloat a) => a -> a -> String 更改为outputBmi :: (RealFloat a, Show a) => a -> a -> String 以防止因使用“calcBmi”而出现“无法推断(显示a)”错误。不知道为什么,有什么见解吗?
    • @Harry 签名(RealFloat a, Show b)=>a->a->b 声明a 可以选择为任何浮点类型,b 可以选择为任何可以转换为字符串的类型。这将允许用户选择例如Float -> Float -> (Bool, Int) 作为整个类型,这不是我们想要的。另外,我们需要将a类型的参数转换为字符串,所以我们需要约束Show a,而不是Show b
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2015-01-21
    • 2018-12-07
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多