我一直在开发一些使用Data.Array来使用多维数组的代码, 现在我想将这些数组放入数据类型,所以我有这样的东西
data MyType = MyType { a :: Int, b :: Int, c :: Array }
Data.Array的类型为:
(Ix i, Num i, Num e) => Array i e
“e”可以是任何类型,而不仅仅是Num。
我确信我完全错过了一个概念。
我如何做到这一点? Data.Array类型与Int,Num,String等有什么不同?
感谢您的帮助!
答案 0 :(得分:11)
Array
不是一种类型。它是类型构造函数。它有种 * -> * -> *
,这意味着你给它两种类型来获得一个类型。你可以把它想象成一个函数。像Int
这样的类型属于*
。 (Num
是一个类型类,这是一个完全不同的东西)。
您宣布c
是记录的字段,即c
是值。值必须具有类型*
。 (对于未装箱的值,实际上还有更多种类,但现在不用担心)。
因此,您需要提供两个类型参数来为c
创建一个类型。您可以选择两种具体类型,也可以将类型参数添加到MyType
以允许在其他地方进行选择。
data MyType1 = MyType { a, b :: Int, c :: Array Foo Bar }
data MyType2 i e = MyType { a, b :: Int, c :: Array i e }
参考
答案 1 :(得分:4)
您需要将类型变量i
和e
添加到MyType
:
data MyTYpe i e = MyType { a, b :: Int, c :: Array i e }