gpt4 book ai didi

haskell - 无法将预期类型 ‘Integer’ 与实际类型 ‘m0 Integer’ 匹配

转载 作者:行者123 更新时间:2023-12-02 14:41:00 31 4
gpt4 key购买 nike

所以我是 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 2return 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 时,编译器期望返回的值是它在错误消息中调用 m0 的某个 Monad 实例的一部分,但是由于该函数具有显式声明的返回类型 Integer,因此无法协调它们。

顺便说一句,您可以将类型声明放宽为:

howManyEqual :: (Eq a, Num t) => a -> a -> a -> t

关于haskell - 无法将预期类型 ‘Integer’ 与实际类型 ‘m0 Integer’ 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027906/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com