Làm thế nào để cung cấp khai báo kiểu rõ ràng cho các hàm khi sử dụng GHCi?


82

Làm cách nào để xác định hàm tương đương của hàm này (lấy từ learningnyouahaskell ) bên trong GHCi?

import Data.List  

numUniques :: (Eq a) => [a] -> Int  
numUniques = length . nub  

Nếu không có khai báo kiểu, GHCi chấp nhận định nghĩa hàm, nhưng nó kết thúc với một kiểu không hữu ích:

Prelude Data.List> import Data.List 
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int

Hàm kết quả chỉ chấp nhận một danh sách các đơn vị làm tham số.

Có cách nào cung cấp khai báo kiểu trong GHCi không? Hoặc có cách nào khác để xác định các hàm như thế này mà không yêu cầu khai báo kiểu không?

Tôi không thấy manh mối rõ ràng nào trong hướng dẫn GHCi và đã thử nghiệm với các biểu thức như sau (vô ích):

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int

Câu trả lời:


101

Có cách nào cung cấp khai báo kiểu trong GHCi không?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub

Hoặc có cách nào khác để xác định các hàm như thế này mà không yêu cầu khai báo kiểu không?

Nếu bạn tắt giới hạn đơn hình với -XNoMonomorphismRestriction, nó sẽ suy ra đúng loại.


3
Tôi vẫn chưa ở đó với tính đơn hình, nhưng nói chung câu trả lời này chỉ cho tôi cách sử dụng dấu chấm phẩy để nhóm các định nghĩa lại với nhau trong GHCi - các hướng dẫn được viết giống như trong tệp .hs, điều này gây ra nhiều vấn đề khác nhau khi thử trong GHCi (các hàm thiếu ràng buộc, v.v. .).
Tomasz Gandor

Nó đáng chú ý là -XNoMonomorphismRestrictionđược kích hoạt theo mặc định cho GHCi từ 7.8.1: downloads.haskell.org/~ghc/latest/docs/html/users_guide/...
N. Shead

13

Lưu ý rằng bạn cũng có thể tránh hạn chế về tính đơn hình chỉ bằng cách thêm "điểm" (tức là các biến rõ ràng) trở lại biểu thức của bạn. Vì vậy, điều này cũng cung cấp cho loại chính xác:

hãy để numUniques x = chiều dài. nub $ x


1
Cảm ơn - thật tuyệt khi biết.
mattbh

Điều này được gọi là mở rộng eta
Bladt

3

Hướng dẫn sử dụng GHC chỉ ra hai cách bổ sung để đạt được điều này. Phần phụ này giới thiệu cấu trúc :{... :}, có thể được sử dụng như sau:

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}

Ngoài ra, bạn có thể bật chế độ nhiều dòng :

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.