类型构造函数后面的异构值列表 (HList) 的类型
Type of a heterogeneous list (HList) of values behind a type constructor
我想定义一个函数,它在某些类型构造函数后面采用任意大小的 HList 值,例如Maybe
:
foo :: HList '[t a, t b, t c, ...] -> Bar
-- For example:
foo :: HList '[Maybe a, Maybe b, Maybe c, ...] -> Bar
在 Haskell 中有什么方法可以做到这一点吗?谢谢!
您可以使用自定义类型 class 添加约束,要求类型涉及相同的 f
类型构造函数。
import Data.HList.HList
class HSame (t :: [Type]) where
instance HSame '[] where
instance HSame '[f x] where
instance HSame (f u : xs) => HSame (f t ': f u ': xs) where
foo :: HSame xs => HList xs -> Bool
foo _ = True
或者,定义一个 Map f xs
类型族并定义
foo :: HList (Map f xs) -> Bool
foo _ = True
但这不适用于类型推断,因为编译器没有简单的方法来推断 f
和 xs
.
NP
type from sop-core 是类型 (k -> Type) -> [k] -> Type
的 n 元乘积,由类型级列表 [k]
和类型构造函数 (k -> Type)
参数化,它包装了每个术语-级别组件:
Prelude> :set -XDataKinds
Prelude> import Data.SOP.NP
Prelude Data.SOP.NP> :t Just True :* Nothing :* Nil
Just True :* Nothing :* Nil :: NP Maybe '[Bool, x]
我想定义一个函数,它在某些类型构造函数后面采用任意大小的 HList 值,例如Maybe
:
foo :: HList '[t a, t b, t c, ...] -> Bar
-- For example:
foo :: HList '[Maybe a, Maybe b, Maybe c, ...] -> Bar
在 Haskell 中有什么方法可以做到这一点吗?谢谢!
您可以使用自定义类型 class 添加约束,要求类型涉及相同的 f
类型构造函数。
import Data.HList.HList
class HSame (t :: [Type]) where
instance HSame '[] where
instance HSame '[f x] where
instance HSame (f u : xs) => HSame (f t ': f u ': xs) where
foo :: HSame xs => HList xs -> Bool
foo _ = True
或者,定义一个 Map f xs
类型族并定义
foo :: HList (Map f xs) -> Bool
foo _ = True
但这不适用于类型推断,因为编译器没有简单的方法来推断 f
和 xs
.
NP
type from sop-core 是类型 (k -> Type) -> [k] -> Type
的 n 元乘积,由类型级列表 [k]
和类型构造函数 (k -> Type)
参数化,它包装了每个术语-级别组件:
Prelude> :set -XDataKinds
Prelude> import Data.SOP.NP
Prelude Data.SOP.NP> :t Just True :* Nothing :* Nil
Just True :* Nothing :* Nil :: NP Maybe '[Bool, x]