Как определить функцию в GHCI через несколько строк?
Вопрос
Я пытаюсь определить любую простую функцию, которая охватывает несколько строк в GHCI, пример следующего в качестве примера:
let abs n | n >= 0 = n
| otherwise = -n
Пока я попробовал нажав Enter после первой строки:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
Я также попытался использовать :{
а также :}
Команды, но я не готов к далеку:
Prelude> :{
unknown command ':{'
use :? for help.
Я использую интерактивную версию GHC 6.6 для Haskell 98 на Linux, что мне не хватает?
Решение
Для охранников (как ваш пример) вы можете просто поставить их все на одну строку, и она работает (охранники не заботятся о расстоянии)
let abs n | n >= 0 = n | otherwise = -n
Если вы хотите написать свою функцию с несколькими определениями, которые шаблон соответствует аргументам, как это:
fact 0 = 1
fact n = n * fact (n-1)
Тогда вы бы использовали брекеты с точками, отделяющими определения
let { fact 0 = 1 ; fact n = n * fact (n-1) }
Другие советы
GHCI Теперь имеет многострочный входной режим, включенный с: Set + M. Например,
Prelude> :set +m
Prelude> let fac 0 = 1
Prelude| fac n = n * fac (n-1)
Prelude|
Prelude> fac 10
3628800
Дэн правильный, но :{
а также :}
Каждый должен появиться на собственной линии:
> :{
> let foo a b = a +
> b
> :}
> :t foo
foo :: (Num a) => a -> a -> a
Это также взаимодействует с правилом макета, поэтому при использовании DO-NOUTIONATION может быть проще в использовании скобок и полуточных колонтов явно. Например, это определение не удается:
> :{
| let prRev = do
| inp <- getLine
| putStrLn $ reverse inp
| :}
<interactive>:1:18:
The last statement in a 'do' construct must be an expression
Но это работает, когда добавлены брекеты и полумилоны:
> :{
| let prRev = do {
| inp <- getLine;
| putStrLn $ reverse inp;
| }
| :}
> :t prRev
prRev :: IO ()
Это действительно будет иметь значение только при высечении определений из файла, где может измениться отступ.
Это выглядит как :{
а также :}
довольно новая особенность. Возможно, вам понадобится обновить GHC.
Редактировать: подтверждено, см. http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/relase-6-8-2.html.
Если вы не хотите обновить GHC только для :{
а также :}
, Вам нужно будет написать все это на одну строку:
> let abs' n | n >= 0 = n | otherwise = -n
Я не знаю ни одно определение в Haskell, который должен Будьте написаны на нескольких линиях. Приведенное выше действительно работает в GHCI:
> :t abs'
abs' :: (Num a, Ord a) => a -> a
Для других выражений, таких как do
Блоки, вам нужно использовать синтаксис неносального макета с фигурными скобками и запятыми с запятой (EUGH).