Haskell:对函数元组进行模式匹配,然后将它们分别应用于某个值

我当时在做一个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)]

我想知道为什么第一种方法不起作用,我是否对模式匹配有误解?

为错字编辑

评论