Vì vậy, tôi có một chức năng apply :: proxy tf -> tf Int -> tf Int
trong đó có một Proxy nhằm mang một họ loại và áp dụng Int cho loại gia đình đó để xác định loại đối số thứ hai và giá trị trả về. Tuy nhiên, tôi nhận được một số câu trả lời khó hiểu từ GHC.Loại đa hình gia đình
{-# LANGUAGE TypeFamilies #-}
import Data.Proxy
type family F (a :: *) :: * where
F Int =()
f :: Proxy F
f = Proxy
apply :: proxy tf -> tf Int -> tf Int
apply _ x = x
-- Doesn't typecheck.
test1 ::()
test1 = apply f()
-- Typechecks fine
test2 ::()
test2 = let g = apply f in g()
test1
từ chối để biên dịch với GHC phun ra lỗi này:
tftest.hs:16:9:
Couldn't match expected type ‘()’ with actual type ‘F Int’
In the expression: apply f()
In an equation for ‘test1’: test1 = apply f()
tftest.hs:16:17:
Couldn't match expected type ‘F Int’ with actual type ‘()’
In the second argument of ‘apply’, namely ‘()’
In the expression: apply f()
gây nhầm lẫn, cho ý kiến ra test1
và sử dụng một let ràng buộc trong test2
làm GHC hạnh phúc và tất cả mọi thứ biên dịch tốt. Bất cứ ai có thể giải thích những gì đang xảy ra ở đây?