2012-07-04 26 views
5

Một trong những ví dụ từ Learn You a Haskell là:Rõ ràng việc xác định thuần túy chức năng để sử dụng

pure (+) <*> Just 3 <*> Just 5

Ông nói:

Vì vậy, lúc đầu, chúng tôi có pure (+), đó là Just (+)

Tôi giả sử rằng Haskell đang sử dụng suy luận kiểu trên hàm <*> để xác định rằng hàm pure trên LHS sẽ là một trong trường hợp của lớp loại Applicative (dựa trên thực tế chúng tôi đang sử dụng Just 5 trên RHS và Just là a Maybe).

Tuy nhiên, có trường hợp bạn có giá trị bạn muốn chuyển thành hàm Functor sử dụng phương pháp pure, nhưng bạn sẽ không sử dụng nó ngay lập tức thông qua hàm <*> và do đó Haskell có thể 't xác định chức năng pure nào để sử dụng? Nếu vậy, bạn sẽ tuyên bố rõ ràng chức năng pure nào để sử dụng?

Hoặc, có phải là trường hợp đó Haskell sẽ không cố gắng để xác định pure chức năng cho đến khi kết quả của pure chức năng được sử dụng trong một số ngữ cảnh (chẳng hạn như khi bạn ăn nó vào một chức năng <*> tại một số điểm)

+1

Đây là câu hỏi suy luận kiểu. – dave4420

Trả lời

11

Bạn sẽ cung cấp cho nó một chú thích kiểu. Nếu bạn đã xác định nó như là một biến, bạn sẽ sử dụng một loại cấp cao nhất chữ ký: (. Đây cũng hoạt động trong letwhere khoản)

foo :: Maybe (Integer -> Integer -> Integer) 
foo = pure (+) 

Hoặc nếu bạn đang sử dụng nó trong một biểu thức , bạn sẽ viết (pure (+) :: Maybe (Integer -> Integer -> Integer)).

Bạn cũng có thể nhận được hàm pure có liên quan mà không phải áp dụng nó cho một đối số. Kể từ khi chúng ta có:

pure :: (Applicative f) => a -> f a 

... chúng ta có thể nói (pure :: a -> Maybe a) để có được một pure loại mong muốn. Tuy nhiên, (pure :: a -> Maybe a) (+) khó hiểu hơn pure (+) :: Maybe (Integer -> Integer -> Integer), vì vậy sau này có thể hữu ích hơn nói chung.

Câu cuối cùng của câu hỏi là chính xác, tuy nhiên: bạn có thể gán pure (+) cho biến không có chữ ký loại và sử dụng sau này ở loại cụ thể cụ thể (chẳng hạn như Maybe (Integer -> Integer -> Integer)) mà không phải sử dụng bất kỳ chú thích kiểu nào . (Có một hạn chế nhỏ: nếu bạn xác định nó là biến cấp cao nhất mà không có bất kỳ chữ ký kiểu nào thì bạn chỉ có thể sử dụng nó là một loại cụ thể, không phải hai loại ở các vị trí khác nhau, do ... nhưng có thể bạn không cần phải lo lắng về điều đó.)

+3

Đoạn cuối cùng của văn bản câu hỏi cũng đúng: Thông thường, nếu bạn không thể quyết định một functor ứng dụng cụ thể để sử dụng được nêu ra, bạn cũng không phải.Không cần phải chọn ngay một loại cụ thể, bạn có thể định nghĩa mã dẫn xuất bị quá tải trong hàm functor ứng dụng. – kosmikus

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