我正在玩一個可擴展記錄庫,而且我想要編寫一個函數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