计算定义矩阵的结果

时间:2013-04-19 16:41:39

标签: haskell matrix increment

所以我对编程很新,Haskell是我学习的第一门语言。我遇到的问题可能很简单,但无论我搜索多少,我都找不到答案。

基本上我所拥有的是一个3x3-Matrix,每个元素都有一个从1到3的数字。这个矩阵是预定义的,现在我需要做的就是创建一个函数,当我输入1,2或3时告诉我这个矩阵中有多少元素有这个值。 我一直在尝试不同的东西,但似乎没有一个允许,例如我为每个可能的数字定义了3个变量,并试图通过

来定义它们
value w =   
  let a=0  
      b=0  
      c=0   
      in
if matrix 1 1==1 then a=a+1 else if matrix 1 1==2 then b=b+1

等。等每个组合和领域。

< - 忽略我正在努力解决的错误语法,我不能用“=”和“if,then”这个事实是我最大的问题。有没有办法绕过这个或者可能使用以前定义的函数中的“存储数据”?

我希望我的问题有点清楚,因为我说我现在只参加了2天的编程,而我似乎无法找到办法让这项工作成功!

1 个答案:

答案 0 :(得分:1)

默认情况下,Haskell不使用可更新变量。相反,您通常会创建一个新值,并将其传递到其他位置(例如,从函数返回它,将其添加到列表中等)。

我将分两步处理:从矩阵中获取元素列表,然后用每个值计算元素。

-- get list of elements using list comprehension 
elements = [matrix i j | i <- [1..3], j <- [1..3]]

-- define counting function
count (x,y,z) (1:tail) = count (x+1,y,z) tail
count (x,y,z) (2:tail) = count (x,y+1,z) tail
count (x,y,z) (3:tail) = count (x,y,z+1) tail
count scores [] = scores

-- use counting function
(a,b,c) = count (0,0,0) elements

有更好的积累分数的方法,但这似乎与你的问题最接近。


根据下面的评论,使用foldl和积累函数addscore代替上述count函数的更惯用的计数方法示例:

-- define accumulation function
addscore (x,y,z) 1 = (x+1,y,z)
addscore (x,y,z) 2 = (x,y+1,z)
addscore (x,y,z) 3 = (x,y,z+1)

-- use accumulation function
(a,b,c) = foldl addscore (0,0,0) elements