- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚发现了 super 棒的 Haskell 库 Numeric.LinearAlgebra.Static
来自 hmatrix包裹。
现在我实现了一个函数,它将矩阵 A 转换为向量 B 和另一个矩阵 C,如下所示:
1 2 3
A = 4 5 6
7 8 9
B = 2 3
C = 5 6
8 9
我想出的成功编译的代码如下所示:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
import GHC.TypeLits
import Numeric.LinearAlgebra.Static
f :: (KnownNat (n + 1), KnownNat n, 1 <= n + 1, ((n + 1) - 1) ~ n)
=> Sq (n + 1) -> (R n, Sq n)
f m = (unrow a, b)
where
(a, b) = splitRows . snd . splitCols $ m
main :: IO ()
main = print $ f $ (matrix [1, 2, 3, 4, 5, 6, 7, 8, 9] :: Sq 3)
现在这很好用,但我希望我可以删除看似多余的东西,如
((n + 1) - 1) ~ n
从类型签名。
f :: Sq (n + 1) -> (R n, Sq n)
这样的签名?没有别的?或者至少像
f :: (KnownNat n, 2 <= n) => Sq n -> (R (n - 1), Sq (n - 1))
?
最佳答案
有类型检查插件可以做到这一点。具体来说,ghc-typelits-natnormalise
可以算出((n + 1) - 1) ~ n
和 1 <= n + 1
, 而 ghc-typelits-knownnat
可以算出KnownNat n
暗示 KnownNat (n+1)
.因此,安装了两个软件包后,您可以编写:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.Normalise #-}
import GHC.TypeLits
import Numeric.LinearAlgebra.Static
f :: (KnownNat n) => Sq (n + 1) -> (R n, Sq n)
f m = (unrow a, b)
where
(a, b) = splitRows . snd . splitCols $ m
main :: IO ()
main = print $ f $ (matrix [1, 2, 3, 4, 5, 6, 7, 8, 9] :: Sq 3)
KnownNat n
约束是不可避免的。
关于haskell - 让 GHC 在 `KnownNat` 上应用基本的数学定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65477585/
我正在处理这种形状的数据类型,使用线性中的V: type Foo n = V (n * 3) Double -> Double 将其固定在 n 上非常重要,因为我希望能够确保在编译时传递正确数量的元素
我一直在尝试(未成功)在运行时的 haskell 中创建一个“对象”*,其类型在运行时使用依赖类型定义。 我在关注 this tutorial on dependent types他们用来在运行时传递
我正在试验单例库,发现一个我不明白的案例。 {-# LANGUAGE GADTs, StandaloneDeriving, RankNTypes, ScopedTypeVariables, Flexi
关于KnownNats,我想知道我是否也可以吃蛋糕。 .我可以编写使用 Nats 的代码吗?可能都是KnownNats和 UnknownNats (SomeNats?)。 例如,如果我有一个依赖类型的
我刚刚发现了 super 棒的 Haskell 库 Numeric.LinearAlgebra.Static来自 hmatrix包裹。 现在我实现了一个函数,它将矩阵 A 转换为向量 B 和另一个矩阵
我一直在尝试实现 Chinese Remainder Theorem ,对于只有两个方程的特定情况,使用Data.Modular包裹。我的想法是,我可以仅用一个模数指定每个方程(使用数字a (mod
我发现了两种在运行时将 Integer 提升为 Nat(或 KnownNat,我还没有得到区分)的方法,使用 TypeLits 和 Proxy(Data.Proxy 和 GHC.TypeLits),或
在 singletons 包中,函数 withKnownNat有以下奇怪的类型签名: withKnownNat::Sing n -> (KnownNat n => r) -> r。 KnownNat
我是一名优秀的程序员,十分优秀!