2010-11-20 38 views
7

động như thế nào đến, mà kiểm tra loại sauCách loại từ đồng nghĩa chính xác hoạt động như thế nào?

{-# LANGUAGE RankNTypes #-} 
module Main where 

class Foo a where 


type FunFoo = (Foo a) => a -> IO() 

data Bar = Bar { 
    funFoo :: FunFoo 
} 

setFunFoo :: FunFoo -> Bar -> Bar 
setFunFoo action bar = bar {funFoo = action} 

nhưng khi thay đổi chữ ký kiểu tắt setFunFoo để

setFunFoo :: ((Foo a) => a -> IO()) -> Bar -> Bar 

nó không? Có cách nào để diễn tả mã trên mà không có từ đồng nghĩa FunFoo không?

+3

Bạn có chắc chắn định sử dụng loại xếp hạng n không? Đó là một chủ đề khá tiên tiến cho một người nào đó hỏi làm thế nào loại từ đồng nghĩa làm việc. –

Trả lời

7

Bạn cần phải thêm một rõ ràng forall như vậy:

setFunFoo :: (forall a. (Foo a) => a -> IO()) -> Bar -> Bar 

Lý do cho điều này là bởi vì bạn muốn phạm vi của các loại biến a được giới hạn ở những loại đối số đầu tiên để setFunFoo. Nếu không có rõ ràng forall, loại được loại bỏ là:

setFunFoo :: forall a. ((Foo a) => a -> IO()) -> Bar -> Bar 
Các vấn đề liên quan