1

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

所以基本上我拥有的是一个 3x3 矩阵,每个元素都有一个从 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 天,我似乎无法找到一种方法来完成这项工作!

4

1 回答 1

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
于 2013-04-19T17:01:07.313 回答