Haskell 不能';不匹配预期的类型'Int';实际类型为'm0 Int';

Haskell 不能';不匹配预期的类型'Int';实际类型为'm0 Int';,haskell,types,compiler-errors,maybe,Haskell,Types,Compiler Errors,Maybe,我目前正在努力学习Haskell。以下功能: findPivot :: [[Double]] -> Int findPivot matrixA = do let firstCol = (transpose(matrixA)!!0) let maxColValue = maximum firstCol let pivotIndex = elemIndex maxColValue firstCol return (from

我目前正在努力学习Haskell。以下功能:

findPivot :: [[Double]] -> Int
findPivot matrixA =
    do
        let firstCol = (transpose(matrixA)!!0)
        let maxColValue = maximum firstCol
        let pivotIndex = elemIndex maxColValue firstCol
        return (fromJust(pivotIndex))
应获取表示矩阵的二维双精度列表,并确定第一列中哪一行的值最大。我知道有些部分效率低下,例如使用列表表示矩阵和使用转置,但我遇到的问题涉及以下编译器错误:

Couldn't match expected type `Int' with actual type `m0 Int'
In the return type of a call of `return'
In a stmt of a 'do' block: return (fromJust (pivotIndex))
In the expression:
  do { let firstCol = (transpose (matrixA) !! 0);
       let maxColValue = maximum firstCol;
       let pivotIndex = elemIndex maxColValue firstCol;
       return (fromJust (pivotIndex)) }
我不确定
m0
是什么意思,但我认为它是一元的。因此,我认为这意味着函数返回一个一元整数。如果能帮助理解这个问题以及如何解决这个问题,我们将不胜感激


谢谢。

do
return
与单子相关。当您使用它们时,您会告诉编译器您打算使用monad

您的函数类型是非一元函数。这告诉编译器您不打算使用monad。编译器只是警告您这种差异

您可以在
do
之外使用
let
,但sytax有点不同

findPivot matrixA = 
            let 
                firstCol = (transpose(matrixA)!!0)
                maxColValue = maximum firstCol
                pivotIndex = elemIndex maxColValue firstCol
            in fromJust(pivotIndex)

这不是您要查找的
返回值。为
return
欢呼并研究其类型应该是很有启发性的。