所以我对编程很新,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天的编程,而我似乎无法找到办法让这项工作成功!
答案 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