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

div*_*nse 5 haskell

所以我是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
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我有同样的错误return 2,并return 0为好.什么样的数据类型是m0 Integer什么,我需要做些什么来解决这个问题?任何帮助,将不胜感激.干杯!!

Mar*_*ann 8

删除所有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
Run Code Online (Sandbox Code Playgroud)

在Haskell中,return不是关键字,而是具有该类型的函数Monad m => a -> m a.它主要用于do表示法中的代码块内,以在Monad实例中返回值'wrapped' .

howManyEqual方法不返回monadic值,而是返回正常的标量Integer,因此return不需要.return无论如何使用时,编译器都希望返回的值是Monadm0在错误消息中调用的某个实例的一部分,但由于该函数具有显式声明的返回类型Integer,因此无法协调这些.

顺便说一句,你可以放松类型声明:

howManyEqual :: (Eq a, Num t) => a -> a -> a -> t
Run Code Online (Sandbox Code Playgroud)


Joh*_*ker 5

有关haskell语法的一些其他主题信息:

else if在haskell中使用并没有错,但这并不常见。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
Run Code Online (Sandbox Code Playgroud)