如何在Haskell中创建不返回Type的类型构造器?
如何创建不以
*(Type)结尾的类型构造器? 我想实现一个签名不以*(Type)结尾的类型构造器(例如k -> k这类kind),下面是我尝试的两个方案:
{-# LANGUAGE TypeFamilies #-} type family TF (a :: k) :: k -- 尝试1:类型同义词 type Identity1 (a :: k) = a -- 此代码可正常编译 type instance TF (a :: k -> k) = Identity1 -- 编译失败:类型同义词‘Identity1’需要接收1个参数,但未传入 -- 尝试2:newtype newtype Identity2 (a :: k) = Identity2 a -- 编译失败:期望类型,但‘a’的kind为‘k’ type instance TF (a :: k -> k) = Identity2 -- 此代码可正常编译
两种尝试的问题:
- 使用类型同义词
Identity1时,Identity1 a(即a :: k)是可行的,但无法通过部分应用Identity1得到k -> k的类型构造器——类型同义词必须完全应用所有参数。 - 使用newtype
Identity2时,可以通过部分应用得到k -> k的构造器,但newtype的结果必须是*(Type)类型,不符合我需要的kind要求。
我之前用Agda开发,习惯了“类型即值”的模式,不确定Haskell是否能实现这类需求。
补充说明:
- 我知道在这个简单示例里,
type instance TF (a :: k -> k) = a可以编译,但这不是我想要的效果。 - 实际需求更复杂:我有一个类型家族
(a :: k) :: k -> k -> k,希望用Compose (a :: k2 -> k3) (b :: k1 -> k2) (c :: k1) = a (b c)来实现它的实例。
内容的提问来源于stack exchange,提问作者DPD-
相关产品推荐
相关产品推荐

