ghci에 여러 줄 명령을 입력하는 데 문제가 있습니다.
다음 2 줄 코드는 파일에서 작동합니다.
addTwo :: Int -> Int -> Int
addTwo x y = x + y
그러나 ghci에 들어가면 오류가 발생합니다.
<interactive>:1:1: error:
Variable not in scope: addTwo :: Int -> Int -> Int
나는 또한 코드를 넣는 것을 시도했지만 :{ ... :}
이 예제에서는 작동하지 않습니다. 왜냐하면 이것은 한 줄에 행을 추가하기 때문입니다.
WinGHCi 버전 2011.2.0.1을 사용하고 있습니다.
답변
대부분의 경우 유형 유추를 사용하여 서명을 해결할 수 있습니다. 귀하의 예에서 다음이 충분합니다.
Prelude> let addTwo x y = x + y
타입 시그니처가있는 정의를 원하거나 정의가 여러 줄에 걸쳐있는 경우 ghci에서 수행 할 수 있습니다.
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 4 7
11
이것을 한 줄로 짜낼 수도 있습니다.
Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
설명서 의 프롬프트 섹션 에있는 대화식 평가에서 ghci와의 상호 작용에 대한 자세한 내용을 확인할 수 있습니다 .
답변
GHCI를 시작하고 다음을 입력하여이 문제를 해결하십시오 :set +m
.
Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude|
Prelude> addTwo 1 3
4
팔.
여기서 일어나고있는 것은 (그리고 나는 주로 당신 에게 이야기 하고 있습니다. Learn You A Haskell을 통해 길을 걷는 동안 도움을 구하는 사람 은 GHCI가 즉시 기능 이름의 바인딩을 변경하는 대화 형 환경이라는 것입니다. 함수 정의를 let
블록으로 묶어야 하스켈이 정의하려는 내용을 알 수 있습니다. :set +m
물건을 여러 줄에 대한 속기 :{
코드를 :}
구축합니다.
공백은 블록 단위로도 중요하므로 형식 정의 다음에 4 개의 공백을 설명하기 위해 함수 정의를 4 개의 공백으로 들여 써야합니다 let
.
답변
사용 let
:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5
답변
현재 GHCI 버전 8.0.1 , let
더 이상 REPL에 함수를 정의 할 필요가 없습니다.
따라서 이것은 당신에게 잘 작동합니다 :
λ: addTwo x y = x + y
λ: addTwo 1 2
3
λ: :t addTwo
addTwo :: Num a => a -> a -> a
Haskell의 형식 유추는 다음과 같이 수레에 적용되는 일반화 된 타이핑을 제공합니다.
λ: addTwo 2.0 1.0
3.0
직접 입력해야하는 경우 여러 줄 입력 let
과 함께 사용해야 :set +m
합니다 ( GHCI에서 여러 줄 입력을 활성화 하는 데 사용).
λ: let addTwo :: Int -> Int -> Int
| addTwo x y = x + y
|
λ: addTwo 1 2
3
그러나 Int
다형성이 아닌 타이핑 때문에 아무것도 전달하지 않으면 오류가 발생합니다 .
λ: addTwo 2.0 1.0
<interactive>:34:8: error:
• No instance for (Fractional Int) arising from the literal ‘2.0’
• In the first argument of ‘addTwo’, namely ‘2.0’
In the expression: addTwo 2.0 1.0
In an equation for ‘it’: it = addTwo 2.0 1.0
답변
버전 GHCi 8.4.4에서는 Aaron Hall의 답변 을 확장 let
하기 위해 :{
:}
스타일 을 사용하는 경우 유형 선언과 함께 사용할 필요가 없습니다 . 따라서 모든 후속 행에 4 칸 들여 쓰기를 추가 할 필요가 없으므로 let
더 긴 기능을 훨씬 쉽게 입력하거나 복사 붙여 넣기 할 수 있습니다. 올바른 들여 쓰기) :
λ: :{
| addTwo :: Int -> Int -> Int
| addTwo x y = x + y
| :}
λ: addTwo 1 2
3
최신 정보
또는으로 여러 줄 입력 모드를 :set +m
켠 다음 let
직접 입력하고 Enter 키를 누른 다음 들여 쓰기없이 정의를 붙여 넣을 수 있습니다.
그러나 이것은 다음과 같은 일부 코드 블록에서 작동하지 않는 것 같습니다.
class Box a where
mkBox :: a -> Boxes.Box
하지만 :{
, :}
기술은 않습니다.