我正在玩一个可扩展记录库,而且我想要编写一个函数field,根据Symbol密钥是否在密钥列表中,它可以作为Lens或Traversal运行。该类型的家庭给出: type family LensOrTraversal key keys s t a b where
LensOrTraversal key '[] s t a b =
Traversal s t a b
Haskell完全是关于抽象。但是由于所有抽象(多态)数据的共同表示 - 堆中的指针,抽象花费我们额外的CPU周期和额外的内存使用。有一些方法可以使抽象代码更好地满足高性能需求。据我所知,一种方法是专业化 - 基本上额外的代码生成(手动或编译器),是正确的? 让我们假设下面所有的代码是严格 如果我们有一个功能sum(这有助于编译器进行更多的优化?): sum :: (Num a) => a ->
我有型家族N元函数从t型n参数o类型的值: type family NAry (n :: Nat) (t :: Type) (o :: Type) = (r :: Type) | r -> n t o where
NAry 1 t o = t -> o
NAry n t o = t -> (NAry (n - 1) t o)
我觉得这个家庭应该是由射我不能证明GHC: er
我试图填补孔下面的代码片段 import Data.Proxy
import GHC.TypeLits
import Data.Type.Equality
import Data.Type.Bool
import Unsafe.Coerce
ifThenElse :: forall (a :: Nat) (b :: Nat) x l r.
(KnownNat a, Known
GHC用户指南显示了Data instance declarations节上型家庭这个例子: data instance GMap (Either a b) v = GMapEither (GMap a v) (GMap b v)
我使用的Either类型用于每当我们要向左或向右价值,所以我希望GMapEither以某种方式提供任何向左或向右变体,但它似乎总是同时拥有: {-# LANGUAG
的概念,定义如下: Inductive eq (A : Type) (x : A) : A → Prop := eq refl : (eq x) x
Parameter a b : A.
当我考虑它的实例eq a b之一,我读A -> Prop类型的(eq a)。 那么,我的问题是,(eq a) b如何确定a和b对应于同一个对象的事实? 对我而言,奇怪的是我们没有关于(eq a)究竟做什么
使用了一些扩展变量数,我可以做这样的事情: {-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
type family TF (a :: Bool) where
TF 'True = Int
TF
我想要一个'通用'地图数据结构,它可以通过提供自定义实例来高效地进行专门化,就像在the GHC manual section on type families中一样。 {-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module