无法将预期类型“ Integer”与实际类型“ m0 Integer”匹配

时间:2018-06-25 16:19:46

标签: haskell

所以我是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是哪种数据类型,我需要做些什么来解决此问题? 任何帮助,将不胜感激。干杯!

2 个答案:

答案 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