Haskell - 基于列表矩阵形成矩阵

时间:2018-04-29 08:24:12

标签: haskell

我想创建一个haskell函数,它接受一个I​​tem Ratings(我声明的数据类型)列表,如下所示:

[[NoRating,R 5.0],[R 5.0,R 4.0],[R 3.0,R 1.0]]

评级声明如下:

data Rating c = NoRating | R c deriving (Show, Eq)

在列表中每个子列表代表属于用户的评级,每个子列表包含多个项目,在前面的例子中有2个项目在子列表中,

我想要返回的是与输入等矩阵的项目评级差异列表。第i行和第j列的值表示同一用户给予项目i和项目j的评级之差的总和

例如,输入

dMatrix [[NoRating,R 5.0],[R 5.0,R 4.0],[R 3.0,R 1.0]]

我想返回

[0.0,3.0,-3.0,0.0]

我已经实现了一个差异函数,它取2个评级并返回差异,看起来像这样,通过

使用它会很好
differenceRatings :: Fractional a => Rating a -> Rating a -> a
differenceRatings NoRating (R a) = 0
differenceRatings (R a) NoRating = 0
differenceRatings  (R a) (R b) = a - b

我很难实现这个,因为我知道在haskell中循环的唯一方法是递归,但在这个例子中我需要以特定的矩阵顺序执行并同时访问同一索引的多个子列表项,谢谢为了你的帮助。

enter image description here

图片就像示例一样,首先我们用0列做0列,差值为0, 然后我们使用第1列进行第0列,为用户1对第0项进行评级 - 对于用户1使用第2项,对于用户2和3进行等等,然后将它们相加,将其放在结果列表的第二个索引中 然后我们用第0列做第1列,一般为负数 最后是第1列第1列,差异为0

我已经草拟了这段代码并尝试了但是我遇到了类型错误

dMatrix :: Fractional a => [[Rating a]] -> [a]
dMatrix [] = []
dMatrix x = dMatrixH1 x 0 0
dMatrixH1 (x:xs) i j = (dMatrixH x:xs i j) ++ (if (j < ((length (x:xs))-1)) 
then dMatrixH (x:xs) i (j+1) else if (i < ((length xs)-1)) then dMatrixH 
(x:xs) (i+1) 0 else 0)
dMatrixH [] _ _ = 0
dMatrixH (x:xs) i j = (differeneRatings (x!!i) (x!!j)) + dMatrixH xs i j

1 个答案:

答案 0 :(得分:0)

使用我的辅助函数管理它,首先发布它们

matrixPairs :: Num a => a -> [(a,a)]
matrixPairs 0 = []
matrixPairs c = matrixPairsH 0 0 (c-1)
matrixPairsH a b c = [(a,b)] ++ if ((b == c) && (a == c)) then [] else if (b == c) then (if (a==c) then [] else matrixPairsH (a+1) 0 c ) else matrixPairsH a (b+1) c

differeneRatings :: Fractional a => Rating a -> Rating a -> a
differeneRatings NoRating (R a) = 0
differeneRatings (R a) NoRating = 0
differeneRatings NoRating NoRating = 0
differeneRatings  (R a) (R b) = a - b

并且这里是所需功能的代码

dMatrix :: Fractional a => [[Rating a]] -> [a]
dMatrix [] = []
dMatrix (x:xs) = dMatrixH (x:xs) (matrixPairs (length x))
dMatrixH _ [] = []
dMatrixH x ((a,b):ys) = [(dMatrixH2 x a b)] ++ dMatrixH x ys
dMatrixH2 [] _ _ = 0
dMatrixH2 (x:xs) a b = (differeneRatings (x!!a) (x!!b)) + dMatrixH2 xs a b
相关问题