将类型的类型约束移除为满足约束的值。 IE。 Num a => a 到 Int
Removing the type constraint on a type to a value that satisfies the constraints. I.e. Num a => a to just Int
我正在使用一个名为 CLaSH 的系统。对于那些不熟悉的人,它的设计方式允许您使用 Haskell.
为 FPGA 进行开发
我正在尝试创建一个无符号值。
类似于:
2 :: Unsigned 3
有效。我希望能够做类似的事情:
x = 3
2::Unsigned x
但我收到错误:
(KnownNat x1) 没有由文字“2”产生的实例
Possible fix:
add (KnownNat x1) to the context of
an expression type signature: Unsigned x1
In the expression: 2 :: Unsigned x
In an equation for `it': it = 2 :: Unsigned x
然后我尝试在同一文件中定义 "fromInteger#"。
let y=fromInteger# x
哪个returns类型
y :: KnownNat n => Unsigned n
有了那个 'y' 我可以通过添加一个指定大小的无符号来给它一个大小。
y + (2 :: Unsigned 3)
这给出了
5
it :: Unsigned 3
如何获得类似
的内容
2::Unsigned x
如果我做不到,为什么我做不到?
编辑:可以使用模板Haskell 完成我需要的操作。请参阅下面的代码和 link 到 CLaSH 组解释
https://groups.google.com/forum/#!topic/clash-language/uPjt8i0lF0M。
我想要的我可以在编译时完成。运行时是不可能的。
如果我理解正确的话,您希望能够在类型签名中将变量引用为类型级自然数。为此,您必须将 x
声明为类型(type
或 data
)而不是值。正是值和类型之间的这种区别将 Haskell 与旧的依赖类型语言区分开来,在这些语言中,您可以自由地引用类型中的声明,而不必担心值和类型之间的差异。所以,试着让你的代码看起来像这样:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
module Lib where
import Data.Proxy
import GHC.TypeLits
data Unsigned (a :: Nat)
type X = 2
main :: IO ()
main =
print (Proxy :: Proxy (Unsigned X))
恐怕我对Clash一无所知,所以也许我不了解全部情况。
我正在使用一个名为 CLaSH 的系统。对于那些不熟悉的人,它的设计方式允许您使用 Haskell.
为 FPGA 进行开发我正在尝试创建一个无符号值。
类似于:
2 :: Unsigned 3
有效。我希望能够做类似的事情:
x = 3
2::Unsigned x
但我收到错误:
(KnownNat x1) 没有由文字“2”产生的实例
Possible fix:
add (KnownNat x1) to the context of
an expression type signature: Unsigned x1
In the expression: 2 :: Unsigned x
In an equation for `it': it = 2 :: Unsigned x
然后我尝试在同一文件中定义 "fromInteger#"。
let y=fromInteger# x
哪个returns类型
y :: KnownNat n => Unsigned n
有了那个 'y' 我可以通过添加一个指定大小的无符号来给它一个大小。
y + (2 :: Unsigned 3)
这给出了 5
it :: Unsigned 3
如何获得类似
的内容2::Unsigned x
如果我做不到,为什么我做不到?
编辑:可以使用模板Haskell 完成我需要的操作。请参阅下面的代码和 link 到 CLaSH 组解释
https://groups.google.com/forum/#!topic/clash-language/uPjt8i0lF0M。
我想要的我可以在编译时完成。运行时是不可能的。
如果我理解正确的话,您希望能够在类型签名中将变量引用为类型级自然数。为此,您必须将 x
声明为类型(type
或 data
)而不是值。正是值和类型之间的这种区别将 Haskell 与旧的依赖类型语言区分开来,在这些语言中,您可以自由地引用类型中的声明,而不必担心值和类型之间的差异。所以,试着让你的代码看起来像这样:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
module Lib where
import Data.Proxy
import GHC.TypeLits
data Unsigned (a :: Nat)
type X = 2
main :: IO ()
main =
print (Proxy :: Proxy (Unsigned X))
恐怕我对Clash一无所知,所以也许我不了解全部情况。