【问题标题】:Haskell type explanationHaskell 类型解释
【发布时间】:2019-01-13 02:41:58
【问题描述】:

我不理解以下代码的简单类型错误

addCustom :: Num a => a -> a
addCustom a = a + 1.2

它抛出

无法从文字“1.2”推导出(小数a)

我不知道为什么。

【问题讨论】:

标签: haskell types


【解决方案1】:

你的类型签名

addCustom :: Num a => a -> a

声明 addCustom 适用于所有数字类型 a,包括例如整数。

但是addCustom (0 :: Integer) 会出错:a + 1.2 不能用整数运算完成,因为1.2 不是整数值(它是小数)。

所以你需要做的就是改变你的函数体:

addCustom a = a + 1

(因为1存在于所有数字类型中)或更改类型签名:

addCustom :: Fractional a => a -> a

(它限制了addCustom,因此它只能用于小数类型,其中1.2 是一个有效值)。

【讨论】:

    【解决方案2】:

    您必须将Fractional a 添加到a 的上下文中。

    addCustom :: (Fractional a) => a -> a
    addCustom a = a + 1.2
    

    应该可以。


    如果您启动 ghci 并查看 1.2 的类型,您会看到

    (1.2) :: Fractional p => p
    

    (+)的类型是

    (+) :: Num a => a -> a -> a
    

    里面说函数可以应用到属于类型类Num的那个。

    所以虽然a -> a 是您的函数的类型,但它没有Fractional 的上下文。仅限Num

    这就是为什么添加该上下文可以解决问题。

    【讨论】:

    • Fractional is a subset of Num,所以我认为你可以省略对Num的约束。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多