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 a
và b
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
và \_ -> 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
), .
Làm thế nào là 'a => b' một loại hàm? –
@ReinHenrichs: thực sự là vậy. '=>' được desugared thành '->' trong GHC Core. –
@ReinHenrichs (A.K.A. từ điển đi qua.) – glaebhoerl