所以我是Haskell的新手,我正在写一个基本函数,该函数将3个整数作为参数并返回相等的数量。
tableView:estimatedHeightForRowAtIndexPath:
但是我收到以下错误:
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
是哪种数据类型,我需要做些什么来解决此问题?
任何帮助,将不胜感激。干杯!
答案 0 :(得分:7)
删除所有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
答案 1 :(得分:4)
有关haskell语法的其他一些主题信息:
在haskell中使用else if
并没有错,但这并不常见。 Haskell支持后卫|
,这与else if
等效。但是,if x then y else z
通常用于二进制条件,而不是收集几个不同的条件。
| x == y = 5
= if x ==y then 5
因此,您的代码可以用以下更优选的方式表示
howManyEqual :: Int -> Int -> Int -> Integer
howManyEqual x y z
| x == y && x == z = 3
| x == y && x /= z = 2
| x == z && x /= y = 2
| y == z && y /= x = 2
| otherwise = 0