首页 > 解决方案 > 无法将预期类型“整数”与实际类型“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什么,我需要做什么来解决这个问题?任何帮助,将不胜感激。干杯!!

标签: haskell

解决方案


删除所有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调用的某个实例的一部分,但是由于该函数具有显式声明的返回类型,因此无法协调这些。m0Integer

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

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

推荐阅读