首页 > 解决方案 > 关于在具有多态类型签名的函数中使用排序操作的问题

问题描述

嗨,我是 haskell 的新手,我创建了一个函数来计算数字的绝对值。

absVal :: (Num a) => a -> a
absVal x
    | x < 0     = x - x - x
    | otherwise = x

这段代码给了我一个错误(这叫什么错误?)“无法推断(Ord a)因使用'<'而引起 "

但是当我将函数重写为

absVal :: (Ord a) => a -> a
absVal x
    | x < 0     = x - x - x
    | otherwise = x

我收到错误“无法推断(Num a)由文字'0'引起”

当我将类型签名写为 Float -> Float 时,函数按预期工作

为什么是这样?

标签: haskell

解决方案


运算符-(减法)需要Num类,文字0(零)也是如此。运算符<(更少)需要Ord类。由于您在函数中使用了这三个类,因此这两个类都是必需的。

您可以通过像这样对它们进行元组来指定多个类:

absVal :: (Num a, Ord a) => a -> a

将类型更改为Float有效,因为Float确实有这两个NumOrd


推荐阅读