- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个常见的模式,其中有一个 [*]
类型的类型级列表,并且我想应用 * -> *
类型的类型构造函数> 到列表中的每个元素。例如,我想将类型 '[Int, Double, Integer]
更改为 '[Maybe Int, Maybe Double, Maybe Integer]
。
这是我尝试实现类型级映射
。
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, TypeOperators, DataKinds, ScopedTypeVariables, GADTs #-}
-- turns a type list '[b1, b2, b3]
-- into the type list '[a b1, a b2, a b3]
class TypeMap (a :: * -> *) (bs :: [*]) where
type Map a bs :: [*]
instance TypeMap a '[b] where
type Map a '[b] = '[a b]
instance TypeMap a (b1 ': b2 ': bs) where
type Map a (b1 ': b2 ': bs) = ((a b1) ': (Map a (b2 ': bs)))
data HList :: [*] -> * where
HNil :: HList '[]
HCons :: a -> HList as -> HList (a ': as)
class Foo as where
toLists :: HList as -> HList (Map [] as)
instance Foo '[a] where
toLists (HCons a HNil) = HCons [a] HNil
instance (Foo (a2 ': as)) => Foo (a1 ': a2 ': as) where
toLists (HCons a as) =
let as' = case (toLists as) of
(HCons a2 as'') -> HCons [head a2] as'' -- ERROR
in HCons [a] as'
这会导致错误
Could not deduce (a3 ~ [t0])
from the context (Foo ((':) * a2 as))
bound by the instance declaration at Test.hs:35:10-50
or from ((':) * a1 ((':) * a2 as) ~ (':) * a as1)
bound by a pattern with constructor
HCons :: forall a (as :: [*]).
a -> HList as -> HList ((':) * a as),
in an equation for `toLists'
at Test.hs:36:14-23
or from (Map [] as1 ~ (':) * a3 as2)
bound by a pattern with constructor
HCons :: forall a (as :: [*]).
a -> HList as -> HList ((':) * a as),
in a case alternative
at Test.hs:38:22-34
`a3' is a rigid type variable bound by
a pattern with constructor
HCons :: forall a (as :: [*]).
a -> HList as -> HList ((':) * a as),
in a case alternative
at Test.hs:38:22
Expected type: HList (Map [] ((':) * a2 as))
Actual type: HList ((':) * [t0] as2)
In the return type of a call of `HCons'
In the expression: HCons [head a2] as''
In a case alternative: (HCons a2 as'') -> HCons [head a2] as''
我尝试添加大量类型注释,但错误或多或少都是相同的:GHC 甚至无法推断 HList 的第一个元素是(正常)列表。我在这里做傻事了吗?有什么违法的吗?或者有什么办法吗?
最佳答案
当您编写 TypeMap a (b1 ': b2 ': bs)
时,这与您定义 Map 所做的递归不一致...这只会在您尝试时导致错误到长度不是 1 或 2 个元素的 TypeMap 列表。另外,在您的情况下,只有一个类型系列会更干净。
type family TypeMap (a :: * -> *) (xs :: [*]) :: [*]
type instance TypeMap t '[] = '[]
type instance TypeMap t (x ': xs) = t x ': TypeMap t xs
请注意,这几乎是以下内容的直接翻译:
map f [] = []
map f (x:xs) = f x : map f xs
关于haskell - 带有 DataKinds 的类型级映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191348/
以下示例是我现实生活中问题的简化版本。它似乎在某种程度上类似于 Retrieving information from DataKinds constrained existential types
我一直在自学类型级编程,并想编写一个简单的自然数加法类型函数。我的第一个版本如下: data Z data S n type One = S Z type Two = S (S Z) type fam
我在让 GHC 在一个应该很明显的地方推断出一个类型时遇到了问题。以下是演示问题的完整片段。 {-# LANGUAGE DataKinds, ScopedTypeVariables, KindSign
假设我有一个货币类型: data Currency = USD | EUR | YEN 和存储 int 的 Money 类型,并由给定的货币参数化(货币被提升为具有 DataKinds 扩展的种类)。
如果我有一个受有限 DataKind 约束的类型 {-# LANGUAGE DataKinds #-} data K = A | B data Ty (a :: K) = Ty { ... } 以及忘
使用 DataKinds,定义如下 data KFoo = TFoo 介绍种类KFoo :: BOX和类型 TFoo :: KFoo .为什么我不能继续定义 data TFoo = CFoo 这样CF
我从Basic Type Level Programming in Haskell学习Haskell的类型编程但是当它引入 DataKinds 扩展时,示例中有些东西似乎令人困惑: {-# LANGU
我有一个 Universe 类型和一个 Worker 类型。 worker 可以改变宇宙。我想要实现的目标是确保宇宙只能由来自该宇宙的 worker (而不是 future 或过去的 worker )
使用高级类型系统的东西。我想要命名 kind 和 a几个生成此类类型的类型构造函数: {-# LANGUAGE DataKinds #-} data Subject = New | Existing
我有一个常见的模式,其中有一个 [*] 类型的类型级列表,并且我想应用 * -> * 类型的类型构造函数> 到列表中的每个元素。例如,我想将类型 '[Int, Double, Integer] 更改为
我有这个代码片段,它使用了大量的 GHC 扩展: {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE GA
我正在尝试找到对 DataKinds 扩展的解释,这对我来说是有意义的,因为我只读过 Learn You a Haskell 。是否有一个标准来源对我来说对我所学到的一点点有意义? 编辑:例如 doc
通过最近有关 HaskellDB 的帖子,我有动力再次研究 HList。由于我们现在在 GHC 中有 -XDataKinds,它实际上有一个异构列表的示例,因此我想研究 HList 与 DataKin
假设我有这个: data Animal = Dog | Cat :t Dog Dog :: Animal 很公平。 :k Dog :1:1: Not in scope: type constr
我正在尝试将 GADT 与 DataKinds 一起使用,如下所示 {-# LANGUAGE KindSignatures, DataKinds, GADTs #-} module NewGadt w
给定一个 ADT data K = A | B Bool DataKinds扩展允许我们将其提升为种类和类型/类型构造函数 K :: BOX 'A :: K 'B :: 'Bool -> K 有没有办
尝试使用 TypeLits 对数据类型进行 JSON 反序列化时,我遇到了以下问题: Couldn't match type ‘n’ with ‘2’ ‘n’ is a rigid type
因此,当我在使用 DataKinds 时尝试确定多态返回值的类型时,ghci 给了我一个有趣的错误。我有以下代码: {-# LANGUAGE DataKinds #-} {-# LANGUAGE Ki
我有一些这样的类型: data Currency = USD | EUR deriving (Show, Typeable) data Money :: Currency
所以,我终于找到了一个可以利用新的 DataKinds 的任务。扩展(使用 ghc 7.4.1)。这是Vec我正在使用: data Nat = Z | S Nat deriving (Eq, Show
我是一名优秀的程序员,十分优秀!