2011-12-09 40 views
94

Tôi gặp sự cố khi nhập các lệnh nhiều dòng trong ghci. Mã 2 dòng sau đây hoạt động từ một tệp:Lệnh nhiều dòng trong GHCi

addTwo :: Int -> Int -> Int 
addTwo x y = x + y 

Nhưng khi tôi nhập vào ghci, tôi gặp lỗi. Tôi cũng đã thử đặt mã bên trong :{ ... :}, nhưng chúng cũng không hoạt động cho ví dụ này, bởi vì đây chỉ là nối các dòng vào một dòng, điều này không phải là trường hợp.

Tôi đang sử dụng WinGHCi, phiên bản 2011.2.0.1

+2

bản sao có thể có của [Cách xác định hàm trong ghci trên nhiều dòng?] (Http://stackoverflow.com/questions/2846050/how-to-define-a-function-in-ghci-across-multiple- dòng) – devnull

Trả lời

125

Hầu hết thời gian, bạn có thể dựa vào loại suy luận để tìm ra một chữ ký cho bạn. Trong ví dụ của bạn, sau đây là đủ:

Prelude> let addTwo x y = x + y 

Nếu bạn thực sự muốn có một định nghĩa với một loại chữ ký, hoặc định nghĩa của bạn kéo dài trên nhiều dòng, bạn có thể làm điều này trong ghci:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 4 7 
11 

Note mà bạn cũng có thể bóp này vào một dòng:

Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y 

bạn có thể tìm hiểu thêm về tương tác với ghci trên phần Interactive evaluation at the prompt của tài liệu.

+1

Cảm ơn rất nhiều vì cả hai giải pháp. Nhưng tôi có một câu hỏi khác liên quan: tại sao bốn khoảng trống hàng đầu được yêu cầu trong dòng thứ hai (trước khi addTwo)? Và điều này phải chính xác, nếu có ít hoặc nhiều khoảng trống, thì có lỗi. – R71

+7

@Rog 'let' bắt đầu một khối; các mục trong một khối được nhóm lại bằng thụt đầu dòng; và ký tự không khoảng trống đầu tiên trong một khối đặt thụt đầu dòng theo đó chúng được nhóm lại. Vì ký tự không khoảng trắng đầu tiên trong khối 'let' ở trên là' a' của 'addTwo', tất cả các dòng trong khối phải được thụt lề chính xác sâu như' a'. –

+0

Cảm ơn. Tôi cũng nhận thấy rằng trong các khối let/where khác.Đây là một sự khác biệt lớn so với các ngôn ngữ khác, nơi mà khoảng trắng bị bỏ qua, vì vậy tôi gặp khó khăn trong việc nắm bắt điều đó. – R71

11

Sử dụng let:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 2 3 
5 
73

Giải quyết vấn đề này bằng cách bắn lên GHCI và gõ :set +m:

Prelude> :set +m 
Prelude> let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| 
Prelude> addTwo 1 3 
4 

Boom.


gì đang xảy ra ở đây (và tôi đang nói chủ yếu để bạn, người googling để được giúp đỡ khi làm việc theo cách của bạn thông qua Learn You A Haskell) là GHCI là một môi trường tương tác, nơi bạn đang thay đổi cam kết ràng buộc của tên hàm một cách nhanh chóng. Bạn phải bọc các định nghĩa chức năng của mình trong một khối let, để Haskell biết rằng bạn sắp định nghĩa một cái gì đó. Công cụ :set +m là viết tắt của mã đa dạng :{:}.

Khoảng trắng cũng có ý nghĩa trong các khối, vì vậy bạn phải thụt lề định nghĩa chức năng của mình sau khi định nghĩa loại của bạn theo bốn khoảng trắng để chiếm bốn khoảng trắng trong let.

+3

Rất đơn giản nhưng không rõ ràng. Tôi muốn hét lên trong cuốn sách tôi đang sử dụng vì không nói với tôi rằng ở trang 1! – Tim

Các vấn đề liên quan