[haskell] 여러 줄에서 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 `|'

또한 :{and :}명령 을 사용하려고 시도했지만 멀리 가지 않았습니다.

Prelude> :{
unknown command ':{'
use :? for help.

Linux에서 Haskell 98 용 GHC Interactive 버전 6.6을 사용하고 있습니다. 무엇을 놓치고 있습니까?



답변

경비원 (예 : 귀하의 예)의 경우 한 줄에 모두 배치 할 수 있으며 작동합니다 (경비는 간격에 신경 쓰지 않습니다)

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-notation을 사용할 때 중괄호와 세미콜론을 명시 적으로 사용하는 것이 더 쉬울 수 있습니다. 예를 들어이 정의는 실패합니다.

> :{
| 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/release-6-8-2.html 참조


답변

:{and 로만 GHC를 업그레이드하지 않으려면 :}한 줄에 모두 작성해야합니다.

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

Haskell 에서 여러 줄로 작성 해야하는 단일 정의에 대해 잘 모릅니다 . 위의 내용은 실제로 GHCi에서 작동합니다.

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

do블록 과 같은 다른 표현식의 경우 중괄호와 세미콜론 (eugh)과 함께 비 레이아웃 구문을 사용해야합니다.


답변

macOS Catalina 10.15.2에서 GHCi 버전 8.2.1을 사용하고 있습니다. 다음은 함수 유형 선언과 가드를 모두 결합하는 방법입니다. 왼쪽의 세로 막대는 GHCi 여러 줄에 대한 것입니다.

λ: let abs' :: (Num a, Ord a) => a -> a
 |     abs' n | n >= 0 = n | otherwise = -n
 |
λ: abs' 7
7
λ: abs' (-7)
7


답변

두 줄을 한 번에 붙여 넣거나 새 줄마다 control-enter를 사용하면 적어도 https://repl.it/languages/haskell 에서 모두 함께 유지하는 것처럼 보입니다 . 두 번째 줄의 시작 부분에 2 개의 점이 표시됩니다. 또는 파일에 넣고 파일을로드하십시오 (: l main). abs가 음수와 어떻게 작동하지 않습니까? 아, 숫자를 괄호로 묶어야합니다.

   let abs n | n >= 0 = n
..           | otherwise = -n
   abs (-1)