【发布时间】:2015-07-01 06:35:32
【问题描述】:
我有一个按类型级列表索引的数据族,其中列表中的类型对应于数据实例的参数。 我想编写根据数据实例具有不同数量和参数的函数,因此我可以将它用作系列中每个数据实例的同义词。
{-# LANGUAGE KindSignatures, DataKinds, TypeOperators,
TypeFamilies, FlexibleInstances, PolyKinds #-}
module Issue where
type family (->>) (l :: [*]) (y :: *) :: * where
'[] ->> y = y
(x ': xs) ->> y = x -> (xs ->> y)
class CVal (f :: [*]) where
data Val f :: *
construct :: f ->> Val f
instance CVal '[Int, Float, Bool] where
data Val '[Int, Float, Bool] = Val2 Int Float Bool
construct = Val2
这编译得很好。但是当我尝试应用construct函数时:
v :: Val '[Int, Float, Bool]
v = construct 0 0 True
它会产生错误:
Couldn't match expected type `a0
-> a1 -> Bool -> Val '[Int, Float, Bool]'
with actual type `f0 ->> Val f0'
The type variables `f0', `a0', `a1' are ambiguous
The function `construct' is applied to three arguments,
but its type `f0 ->> Val f0' has none
In the expression: construct 0 0 True
In an equation for `v': v = construct 0 0 True
【问题讨论】:
标签: haskell type-families type-level-computation