2015-04-24 33 views
8

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?

Trả lời

12

So I have a function apply :: proxy tf -> tf Int -> tf Int which takes a Proxy intended to carry a type family

Bạn không thể thực hiện việc này. Loại gia đình phải luôn luôn được áp dụng đầy đủ, như loại từ đồng nghĩa mà họ là một generalisation. Một biến kiểu không bao giờ có thể được khởi tạo cho một họ loại dưới bão hòa.

Đó là một lỗi trong GHC 7.8.3 mà nó không đã từ chối chương trình của bạn bắt đầu từ

f :: Proxy F 
Các vấn đề liên quan