Ошибка Haskell - 'ошибка разбора на входе `->' - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь объявить функцию в Haskell GHCi как

fact :: Int -> Int

Но я получаю эту ошибку - error: parse error oninput `-> '

Я не понимаю, почему это происходит. Может кто-нибудь, пожалуйста, объясните мне это? Благодарю.

1 Ответ

5 голосов
/ 08 ноября 2019

Во-первых, похоже, что вы используете довольно старую версию GHC. В более новых версиях синтаксис GHCi немного смягчен.

Но все же: то, что вы вводите в GHCi, делает не по тем же правилам, что вы пишете в исходном файле Haskell. В частности, приглашение GHCi по сути является оценщиком цепочек монад IO, причина в том, что вы можете написать что-то вроде

Prelude> putStrLn "Hello"
Hello

или

Prelude> readFile "test.txt" 
"fubar\nbaz"

и на самом деле выполнить правильноесть . Напротив, в исходном файле на Haskell вы только объявляете привязки , и они затем могут быть вызваны в действии main или сеансе GHCi.

Но в этом случае вы хотитеобъявить привязку в самом GHCi. Вы можете сделать это тоже, но это немного неловко, в основном вам нужно начать с let, а затем сжать все в одну строку:

Prelude> let fact :: Int -> Int; fact n = product [1..n]

На самом деле , более новая версия GHCi позволяет вам опустить let, и вы можете иметь многострочные определения, используя специальный синтаксис скобок:

Prelude> :{
Prelude| fact :: Int -> Int
Prelude| fact n = product [1..n]
Prelude| :}

, но я бы рекомендовал против этого. Если у вас действительно есть большие определения, лучше поместите их в правильный источник на Haskell и загрузите в GHCi.

...