我在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)
附带的绑定究竟是什么意思以及如何解决?
答案 0 :(得分:3)
因为您为array
定义了类型签名,所以squares
(array
是库函数,您不能重新定义它,你当然可以自己编写)。现在编译器认为你的目标是定义自己的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]]