5

我目前正在努力学习 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意味着什么,但我认为它意味着单子。所以,我认为这意味着该函数正在返回一个单子 int。对于理解这个问题以及如何解决它的任何帮助将不胜感激。

谢谢。

4

1 回答 1

7

do并且return与单子有关。当你使用它们时,你告诉编译器你打算使用 monad。

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

您可以let在外部使用do,但语法有点不同

findPivot matrixA = 
            let 
                firstCol = (transpose(matrixA)!!0)
                maxColValue = maximum firstCol
                pivotIndex = elemIndex maxColValue firstCol
            in fromJust(pivotIndex)
于 2014-11-15T20:37:24.330 回答