类型构造函数后面的异构值列表 (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

但这不适用于类型推断,因为编译器没有简单的方法来推断 fxs.

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]