2014-10-31 3 views
1

Я только что начал изучать Haskell. Я начинаю с написания простой функции, которая принимает два значения n и x, а затем отображает два целочисленных значения, вычисленные с ним.Ошибка анализа при запуске простой программы Haskell

test n x = do 
    cell1 = round(n*n*x) 
    cell2 = n*n - cell1 
    print cell1 
    print cell2 

Но он не работает и продолжает давать мне Синтаксической ошибку на входе `=» ошибки. Что происходит?

+4

'let cell1 = ...' вместо 'cell1 = ...'. – Zeta

ответ

4

Вы попали в первую проблему с Монадами. То, что вы, вероятно, хотите здесь является let заявление внутри do блока

test n x = do 
    let cell1 = round (n * n * x) 
     cell2 = n * n - cell1 
    print cell1 
    print cell2 

Разница здесь в том, что вы не можете назначить непосредственно внутри do блока, поскольку все do блоки desugar на вызовы >>= и >>. let оператор позволяет определить локальное значение, как вы можете в определении функции, как

f x = 
    let y = 2 * x 
     z = y * y * y 
    in z + z + y 

образом, ваша функция будет desugar бы как

test n x = 
    let cell1 = round (n * n * x) 
     cell2 = n * n - cell1 
    in (print cell1 >> print cell2) 

Где >> только цепи два монадических действий вместе. Обратите внимание, что на самом деле это не так, как это desugars, я выбрал представление, которое эквивалентно в этом случае, но это не совсем то, что создавал бы компилятор.

+0

. Помимо избыточного набора круглых скобок, это * именно официальное desugaring из [language report] (https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14). Конечно, компилятор не остановится на этом этапе ... –

+0

@ ØrjanJohansen Я только что предположил, что это могло бы быть чем-то другим, поскольку привязки 'let' могут использовать значения, извлеченные из монадических действий (' do {x <- m; пусть y = fx; return y} ', например). – bheklilr

+0

Хорошо, тогда как мне вызвать функцию в командной строке? Как я запускаю файл программы, тогда я просто делаю: test 2 0.4? Потому что это не возвращает мне никакого результата. –

Смежные вопросы