haskell - 无法将预期类型“整数”与实际类型“m0 整数”匹配
问题描述
所以我是 Haskell 的新手,我正在编写一个基本函数,它接受 3 个整数作为参数并返回有多少相等。
howManyEqual :: Int->Int->Int->Integer
howManyEqual x y z =
if x == y && x == z then return 3
else if x == y && x /= z then return 2
else if x == z && x /= y then return 2
else if y == z && y /= x then return 2
else return 0
但我收到以下错误:
Prelude> :load ex4.1_2.hs
[1 of 1] Compiling Main ( ex4.1_2.hs, interpreted )
ex4.1_2.hs:11:34:
Couldn't match expected type ‘Integer’
with actual type ‘m0 Integer’
In the expression: return 3
In the expression:
if x == y && x == z then
return 3
else
if x == y && x /= z then
return 2
else
if x == z && x /= y then
return 2
else
if y == z && y /= x then return 2 else return 0
我也有同样的return 2
错误return 0
。什么样的数据类型是m0 Integer
什么,我需要做什么来解决这个问题?任何帮助,将不胜感激。干杯!!
解决方案
删除所有return
关键字:
howManyEqual :: Int -> Int -> Int -> Integer
howManyEqual x y z =
if x == y && x == z then 3
else if x == y && x /= z then 2
else if x == z && x /= y then 2
else if y == z && y /= x then 2
else 0
在 Haskell 中,return
不是关键字,而是类型为 的函数Monad m => a -> m a
。它主要用于在代码块中以do
表示法返回“包装”在Monad
实例中的值。
该howManyEqual
方法不返回一元值,而是一个正常的标量Integer
,因此return
不是必需的。无论如何,当您使用时return
,编译器希望返回的值是它在错误消息中Monad
调用的某个实例的一部分,但是由于该函数具有显式声明的返回类型,因此无法协调这些。m0
Integer
顺便说一句,您可以将类型声明放宽为:
howManyEqual :: (Eq a, Num t) => a -> a -> a -> t
推荐阅读
- mysql - 在 SELECT Query Builder 中使用 AES_DECRYPT - Laravel
- python - 仅运行下游任务而不是当前任务 - 气流
- python-3.x - 损坏的 HTML 标签 - BeautifulSoup
- android - 与另一个应用程序共享我的应用程序目录中的 PDF 文件有效但打开它没有
- javascript - HTML2Canvas 适用于桌面,但不适用于移动设备。怎么修?
- ubuntu - 为什么当我想打开 minergate 控制台版本但它给我这个错误?
- javascript - 每次单击时旋转元素
- python - 多个dicom图像到灰度
- javascript - 在浏览器控制台中访问 Webpack 包中的项目
- javascript - 为什么orientationchange事件不会在桌面上触发?