我正在尝试使用Haskell的线性代数库来计算一些特征值,但首先我需要先尝试添加矩阵。
import Numeric.LinearAlgebra.Data
matrix 3 [1,2,3,4,5,6,7,8,9 ] + matrix 3 [1,2,3,4,5,6,7,8,9 ]
(3><3)
[ 2.0, 4.0, 6.0
, 8.0, 10.0, 12.0
, 14.0, 16.0, 18.0 ]
但是,如果我尝试表示另一种方式,我会收到错误消息
( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ] + ( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ]
No instance for (Element a0) arising from a use of ‘print’
The type variable ‘a0’ is ambiguous
我甚至不确定matrix 3 [1,2,3,4,5,6,7,8,9 ]
因为我想指定我想要一个3×3矩阵。其他3人去哪儿了?
答案 0 :(得分:4)
问题源于类型签名的差异。
var PORT = 6024;
var MULTICAST_ADDR = '239.255.255.250';
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
client.on('listening', function () {
var address = client.address();
console.log('UDP Client listening on ' + address.address + ":" + address.port);
});
client.on('message', function (message, rinfo) {
console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
});
client.bind(PORT, function () {
client.addMembership(MULTICAST_ADDR);
});
所以实际上 matrix :: Int -> [ℝ] -> Matrix ℝ
(><) :: Storable a => Int -> Int -> [a] -> Matrix a
的类型为matrix 3 [1,2,3,4,5,6,7,8,9 ]
,而Matrix ℝ
的类型为( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ]
。然后,问题突然变得易于处理。在您指定(Num a, Foreign.Storable.Storable a) => Matrix a
之前,您不知道a
是什么,因此您无法实际评估矩阵的总和(仅生成thunk),因此您可以&# 39;打印它。
快速解决方法是指定矩阵的类型
(+)
哪个输出(给定正确的导入):
(3 >< 3) ([1..9] :: [ℝ]) + (3 >< 3) ([1..9] :: [ℝ])
我想(3><3)
[ 2.0, 4.0, 6.0
, 8.0, 10.0, 12.0
, 14.0, 16.0, 18.0 ]
,但请注意(3 >< 3) ([1..9] :: [Integer]) + (3 >< 3) ([1..9] :: [Integer])
的{{1}}实例有Num
,所以我们需要Matrix
来(Container Matrix a, Num (Vector a)) => Num (Matrix a)
实例。但是,您可以检查Vector a
是否没有num声明。有效的替代方案:
Num