如何指定固定大小的向量的类型?
How to specify the type of a vector of fixed size?
我正在尝试使用 Data.Vector.Fixed
作为函数的输入,并且正在努力在类型签名中指定向量的维度。
例如,我正在尝试执行以下操作:
acronym :: Vector (Peano 8) String -> String
acronym = foldl1 (++)
并因此使用 Data.Vector.Fixed.Cont
中定义的 peano 数指定向量的维度 (8)。
但是,尝试编译它会出现类型不匹配错误:
...:12: error:
* Expected a type, but
`Vector (Peano 8) String' has kind
`Constraint'
* In the type signature:
acronym :: Vector (Peano 8) String -> String
|
61 | acronym :: Vector (Peano 8) String -> String
| ^^^^^^^^^^^^^^^^^^^^^^^
...:20: error:
* Expected kind `* -> *', but `Peano 8' has kind `PeanoNum'
* In the first argument of `Vector', namely `(Peano 8)'
In the type signature: acronym :: Vector (Peano 8) String -> String
|
61 | acronym :: Vector (Peano 8) String -> String
如何在类型签名中指定固定向量的大小?
您可能正在寻找类似的东西:
{-# LANGUAGE DataKinds, FlexibleContexts, GADTs #-}
import qualified Data.Vector.Fixed as V
acronym :: (V.Vector v String, V.Dim v ~ 8) => v String -> String
acronym = V.foldl1 (++)
类型 class 约束 Vector v String
表示 v
是一个元素类型为 String
的向量,而约束 Dim v ~ 8
确保它具有大小合适。
它可以与特定向量类型一起使用,例如盒装向量或连续向量,如下所示:
import qualified Data.Vector.Fixed.Boxed as BV
import qualified Data.Vector.Fixed.Cont as CV
eight = ["one","two","three","four","five","six","seven","eight"]
main = do
print $ acronym (V.fromList eight :: BV.Vec 8 String)
print $ acronym (V.fromList eight :: CV.ContVec 8 String)
我正在尝试使用 Data.Vector.Fixed
作为函数的输入,并且正在努力在类型签名中指定向量的维度。
例如,我正在尝试执行以下操作:
acronym :: Vector (Peano 8) String -> String
acronym = foldl1 (++)
并因此使用 Data.Vector.Fixed.Cont
中定义的 peano 数指定向量的维度 (8)。
但是,尝试编译它会出现类型不匹配错误:
...:12: error:
* Expected a type, but
`Vector (Peano 8) String' has kind
`Constraint'
* In the type signature:
acronym :: Vector (Peano 8) String -> String
|
61 | acronym :: Vector (Peano 8) String -> String
| ^^^^^^^^^^^^^^^^^^^^^^^
...:20: error:
* Expected kind `* -> *', but `Peano 8' has kind `PeanoNum'
* In the first argument of `Vector', namely `(Peano 8)'
In the type signature: acronym :: Vector (Peano 8) String -> String
|
61 | acronym :: Vector (Peano 8) String -> String
如何在类型签名中指定固定向量的大小?
您可能正在寻找类似的东西:
{-# LANGUAGE DataKinds, FlexibleContexts, GADTs #-}
import qualified Data.Vector.Fixed as V
acronym :: (V.Vector v String, V.Dim v ~ 8) => v String -> String
acronym = V.foldl1 (++)
类型 class 约束 Vector v String
表示 v
是一个元素类型为 String
的向量,而约束 Dim v ~ 8
确保它具有大小合适。
它可以与特定向量类型一起使用,例如盒装向量或连续向量,如下所示:
import qualified Data.Vector.Fixed.Boxed as BV
import qualified Data.Vector.Fixed.Cont as CV
eight = ["one","two","three","four","five","six","seven","eight"]
main = do
print $ acronym (V.fromList eight :: BV.Vec 8 String)
print $ acronym (V.fromList eight :: CV.ContVec 8 String)