J. *_*son 5 haskell types vector dependent-type
我在有限s 上做了一个" ZipVector"风格Applicative,Vector它使用和类型将有限向量粘合到Unit模拟"无限"向量的s上.
data ZipVector a = Unit a | ZipVector (Vector a)
deriving (Show, Eq)
instance Functor ZipVector where
fmap f (Unit a) = Unit (f a)
fmap f (ZipVector va) = ZipVector (fmap f va)
instance Applicative ZipVector where
pure = Unit
Unit f <*> p = fmap f p
pf <*> Unit x = fmap ($ x) pf
ZipVector vf <*> ZipVector vx = ZipVector $ V.zipWith ($) vf vx
Run Code Online (Sandbox Code Playgroud)
这可能足以满足我的需求,但是我想要一个"固定维度"模型,可以通过依赖键入的"Vector"获得的应用实例建模.
data Point d a = Point (Vector a) deriving (Show, Eq)
instance Functor (Point d) where
fmap f (Point va) = Point (fmap f va)
instance Applicative Point where
pure = Vector.replicate reifiedDimension
Point vf <*> Point vx = Point $ V.zipWith ($) vf vx
Run Code Online (Sandbox Code Playgroud)
其中dphantom参数是类型级别Nat.我怎么能(如果可能的话)reifiedDimension在Haskell中写?此外,如果再有可能,因为(Point v1) :: Point d1 a和(Point v2) :: Point d2 a我怎样才能得到length v1 == length v2我可以得到d1 ~ d2?
我如何(如果可能的话)
reifiedDimension用 Haskell 编写?
使用GHC.TypeLits和ScopedTypeVariables:
instance SingI d => Applicative (Point d) where
pure = Point . Vector.replicate reifiedDimension
where reifiedDimension = fromInteger $ fromSing (sing :: Sing d)
...
Run Code Online (Sandbox Code Playgroud)
请参阅我的回答以获取完整示例。
此外,如果可能的话,给定
(Point v1) :: Point d1 a我(Point v2) :: Point d2 a怎样才能得到length v1 == length v2我能得到d1 ~ d2?
没有Data.Vector。您需要一个对类型中的长度进行编码的向量类型。您能做的最好的事情就是自己维护它并通过不导出Point构造函数来封装它。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |