2014-11-15 3 views
4

В настоящее время я изо всех сил пытаюсь изучить Haskell. Следующая функция:Не удалось совместить ожидаемый тип `Int 'с фактическим типом` m0 Int'

findPivot :: [[Double]] -> Int 
findPivot matrixA = 
    do 
     let firstCol = (transpose(matrixA)!!0) 
     let maxColValue = maximum firstCol 
     let pivotIndex = elemIndex maxColValue firstCol 
     return (fromJust(pivotIndex)) 

Предполагается взять 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 означает, но Я предполагаю, что это означает монадическое. Итак, я думаю, это означает, что функция возвращает монадический int. Любая помощь в понимании этой проблемы и ее решении будет чрезвычайно оценена.

Спасибо.

+1

Это не 'return' вы ищете. Хооглинг для «возвращения» и изучения типов должен быть просвещен. –

ответ

6

do и return относятся к монадам. Когда вы используете их, вы сообщаете компилятору, что собираетесь использовать монады.

Ваш тип функции не является монадическим. Это говорит компилятору, что вы не собираетесь использовать монады. Компилятор просто предупреждает вас об этом несоответствии.

Вы можете использовать let вне do, но sytax немного отличается

findPivot matrixA = 
      let 
       firstCol = (transpose(matrixA)!!0) 
       maxColValue = maximum firstCol 
       pivotIndex = elemIndex maxColValue firstCol 
      in fromJust(pivotIndex) 
Смежные вопросы