Как определить функцию в GHCI через несколько строк?

StackOverflow https://stackoverflow.com/questions/2846050

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь определить любую простую функцию, которая охватывает несколько строк в 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top