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

Этот ответ потерпит неудачу, если value = 1.005.

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

Number(Math.round(1.005+'e2')+'e-2').toFixed(2); // 1.01

Кредит: Деление на округление в JavaScript

142
задан Peter McG 17 May 2010 в 00:16
поделиться

4 ответа

для охранников (например, в вашем примере), вы можете просто поместить их всех в одну строку, и это сработает (охранники не заботятся о расстоянии)

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) }
122
ответ дан 23 November 2019 в 22:38
поделиться

Похоже, : { и :} - довольно новая функция. Возможно, вам потребуется обновить GHC.

Редактировать: подтверждено, см. http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html

18
ответ дан 23 November 2019 в 22:38
поделиться

Если вы не хотите обновлять GHC только для : { и :} , вам нужно написать все в одной строке:

> let abs' n | n >= 0 = n | otherwise = -n

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

> :t abs'
abs' :: (Num a, Ord a) => a -> a

Для других выражений, таких как do блоков, вам нужно использовать синтаксис без макета с фигурными скобками и точками с запятой (ну).

7
ответ дан 23 November 2019 в 22:38
поделиться

Дэн прав, но : { и :} должны появляться в каждой отдельной строке:

> :{ 
> let foo a b = a +
>           b
> :}
> :t foo
foo :: (Num a) => a -> a -> a

Это также влияет на правило компоновки, поэтому при использовании нотации do может быть проще явно использовать фигурные скобки и точки с запятой. Например, это определение не работает:

> :{
| 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 ()

Это действительно имеет значение только при вставке определений из файла, где отступы могут измениться.

57
ответ дан 23 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: