2015-11-17 9 views
6

Tôi tự hỏi nếu nó có thể có một chức năng (kiểu giống như dataToTag#) như:Có cách nào để xác định khi chạy, trong GHC, liệu giá trị trừu tượng có phải là một hàm không?

isFunction# :: a -> Bool 

hoặc có khả năng tương đương:

isFunction# :: Any -> Bool 

trả về True iff giá trị thông qua tại như một cuộc tranh cãi là một loại a -> b (hoặc, cho rằng vấn đề, a => b) tại thời gian chạy cho một số loại ab hoặc newtype có loại cơ bản là (để nó "xem qua" newtype s, b ut tất nhiên không phải là data), mà không ép buộc đối số của nó. Tôi không thấy bất cứ điều gì như thế này trong GHC.Prim bản thân mình, nhưng tôi có thể đã bỏ lỡ một cái gì đó, hoặc có thể nó có thể với một primer CMM thủ công hoặc một cái gì đó.

Bây giờ câu hỏi đã xảy ra với tôi, tôi tò mò về câu trả lời vì mục đích riêng của mình (question Y), nhưng lý do ban đầu xảy ra với tôi (câu hỏi X) là đơn khiếu nại thường được chống lại seq. phá vỡ eta tương đương bằng cách làm cho nó có thể quan sát sự khác biệt giữa undefined\_ -> undefined, và tôi đã tự hỏi nếu nó có thể làm cho một phiên bản của seq (myseq a = if isFunction# a then flip const a else seq a) vẫn còn "kỳ diệu đa hình" (công trình forall a), .

+1

Làm thế nào là 'a => b' một loại hàm? –

+2

@ReinHenrichs: thực sự là vậy. '=>' được desugared thành '->' trong GHC Core. –

+0

@ReinHenrichs (A.K.A. từ điển đi qua.) – glaebhoerl

Trả lời

4

Không, chắc chắn là không. Làm thế nào nó có thể biết mà không đánh giá đối số?

Nhưng để giải quyết câu hỏi của bạn X trực tiếp, bạn đề nghị myseq là tồi tệ hơn thực sự seq vì nó phá vỡ parametricity. Có phải là myseq undefined :: b -> b dưới cùng hoặc danh tính? Nó phụ thuộc vào biến kiểu a (undefined :: a) được khởi tạo với một kiểu hàm hay không.

Trong Haskell, bạn luôn được phép thả forall a. khi a không xuất hiện trong loại nào cả, nhờ vào tham số: lựa chọn a không thành vấn đề. myseq của bạn sẽ mất thuộc tính đó.

Đây cũng là lý do tại sao bạn không thể triển khai isFunction# mà không chú thích các giá trị trong thời gian chạy với các loại dự định của chúng (isFunction# undefined tương tự vô nghĩa).

+0

'seq' tự phá vỡ tham số. – dfeuer

+0

Vâng, các từ bị mờ. Nó không phá vỡ cùng một tính năng mà 'myseq' sẽ. –

+1

Cụ thể hơn, tôi nghĩ rằng nó phù hợp với ý tưởng về tham số mà tất cả các loại bạn có thể định lượng qua hỗ trợ một số hoạt động phổ biến. Sau đó, bạn sẽ nhận được đảm bảo tương ứng yếu hơn từ tham số. Nhưng nếu bạn có thể viết các biểu thức của kiểu 'forall a. Int' có giá trị phụ thuộc vào sự lựa chọn của loại 'a', sau đó bạn không có hình thức tham số nào cả. –

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