haskell - 关于在具有多态类型签名的函数中使用排序操作的问题
问题描述
嗨,我是 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 时,函数按预期工作
为什么是这样?
解决方案
运算符-
(减法)需要Num
类,文字0
(零)也是如此。运算符<
(更少)需要Ord
类。由于您在函数中使用了这三个类,因此这两个类都是必需的。
您可以通过像这样对它们进行元组来指定多个类:
absVal :: (Num a, Ord a) => a -> a
将类型更改为Float
有效,因为Float
确实有这两个Num
和Ord
推荐阅读
- javascript - 在 chartJS 和 Angular 上进行水平滚动时使 y 轴保持粘性
- drop-down-menu - Bootstrap 多级菜单焦点
- c# - 在修复连接池问题后发生读取器关闭时调用 FieldCount 的无效尝试
- asp.net - Sandcastle 帮助文件生成器未显示 .ascx.designer.vb 文件中 html/asp.net 元素的 xml 注释文档
- python - Keras 模型中的内置标准化
- android - Android Gradle - 如何在应用安装后运行任务
- php - 如果订单总数为 0,则重命名 Woocommerce“下订单”按钮
- javascript - 尝试重新编码 OpenLayers 函数时出现重新投影问题
- python - 加载或倾倒泡菜时如何阻止动画 QCursor 冻结?
- android - 为什么文本视图中的文本在回收站视图中被截断?