为什么这个Haskell数组代码不起作用?

时间:2017-01-26 17:55:04

标签: arrays haskell

我在Haskell中尝试过这段代码:

array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
squares = array (1,100) [(i, i*i) | i <- [1..100]]

但是当我运行该代码时,我得到了GHCi的这条消息:

The type signature for array lacks an accompanying binding
      (The type signature must be given where array is declared)

附带的绑定究竟是什么意思以及如何解决?

1 个答案:

答案 0 :(得分:3)

因为您为array 定义了类型签名,所以squaresarray是库函数,您不能重新定义它,你当然可以自己编写)。现在编译器认为你的目标是定义自己的array并说:“得到了,但是你的函数定义在哪里?”因此缺少绑定(实施可以这么说)。

绑定因此是其实现(此处为squares = array (1,100) [(i, i*i) | i <- [1..100]])。此外,在括号之间,编译器还表示您无法定义所需的函数,它必须位于函数签名所在的文件中(签名是您定义其类型的位置,因此:: (Ix a) => (a,a) -> [(a,b)] -> Array a b )。

鉴于您打算为squares提供签名,类型签名过于宽泛。最通用的签名是:

squares :: (Enum e, Num e, Ix e) => Array e e
squares = array (1,100) [(i, i*i) | i <- [1..100]]