我当时在做一个haskell项目,不得不为Onitama计算一些动作,偶然发现了我认为很奇怪的东西。 我将自己的移动存储为查找表,例如,以以下方式存储的兔子移动:
("Rabbit", [(subtract 1, subtract 1), ((+) 1,(+) 1), ((+) 0,(+) 2)])
每个元组代表一个可能的移动,即向上移动1和向侧面1等。 然后,我尝试了以下功能,根据给定的移动步骤计算出一块的新位置:
computeMove :: (Int,Int) -> (Int->Int,Int->Int)->(Int,Int)
computeMove (x,y) (f,g) = (f x, g y)
但这并没有给出正确的结果,例如映射(0,1)的所有可能的移动会导致:
rabbit = [(subtract 1, subtract 1), ((+) 1,(+) 1), ((+) 0,(+) 2)]
piece = (0,1)
map (computeMove piece) rabbit
[(-1,-1),(1,1),(0,2)]
Then i tried redefining the function using fst
and snd
and got the correct result:
computeMove :: (Int,Int) -> (Int->Int,Int->Int)->(Int,Int)
computeMove (x,y) fs = ((fst fs) x, (snd fs) y)
map (computeMove piece) rabbit
[(-1,0),(1,2),(0,3)]
我想知道为什么第一种方法不起作用,我是否对模式匹配有误解?
为错字编辑