我目前正在努力学习Haskell。以下功能:
findPivot :: [[Double]] -> Int
findPivot matrixA =
do
let firstCol = (transpose(matrixA)!!0)
let maxColValue = maximum firstCol
let pivotIndex = elemIndex maxColValue firstCol
return (fromJust(pivotIndex))
应该获取代表矩阵的double的2D列表,并确定第一行中哪一行具有最大值。我知道有一些效率低下的部分,例如使用列表表示矩阵和使用转置,但是我遇到的问题涉及以下编译器错误:
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
是什么意思,但我认为它的意思是monadic。因此,我认为这意味着该函数返回的是monadic int。我们非常感谢您理解该问题以及如何解决该问题。谢谢。
最佳答案
do
和return
与monad有关。使用它们时,您告诉编译器您打算使用monad。
您的函数类型是非一元函数。这告诉编译器您不打算使用monad。编译器只是警告您这种差异。
您可以在let
之外使用do
,但是语法有所不同
findPivot matrixA =
let
firstCol = (transpose(matrixA)!!0)
maxColValue = maximum firstCol
pivotIndex = elemIndex maxColValue firstCol
in fromJust(pivotIndex)