首页 > 解决方案 > Haskell - 基于列表矩阵形成矩阵

问题描述

我会创建一个带有项目评级列表(我声明的数据类型)的 haskell 函数,如下所示:

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

Rating 的声明如下所示:

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中循环的唯一方法是递归,但在这种情况下,我需要以特定的矩阵顺序执行并同时访问相同索引的多个子列表项,感谢您的帮助.

在此处输入图像描述

像这样的例子,首先我们用第 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

标签: haskell

解决方案


设法使用我的两个辅助函数来完成它,首先发布它们

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

推荐阅读