Programing

여러 줄에서 ghci로 함수를 정의하는 방법은 무엇입니까?

lottogame 2020. 6. 14. 10:22
반응형

여러 줄에서 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

I'm not aware of any single definition in Haskell that must be written on multiple lines. The above does indeed work in GHCi:

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

For other expressions, such as do blocks, you'll need to use the non-layout syntax with curly braces and semicolons (eugh).

참고URL : https://stackoverflow.com/questions/2846050/how-to-define-a-function-in-ghci-across-multiple-lines

반응형