haskell - Haskell 函数逆向工程
问题描述
我需要分析以下 Haskell 函数,它是更大程序的一部分(从此处提取):
findMoves :: Position -> [Position]
findMoves (left,right) = elems $ Data.Set.filter validPos moves where
moves | Farmer `member` left = Data.Set.map (move delItem addItem) left
| otherwise = Data.Set.map (move addItem delItem) right
move f1 f2 item = (f1 item left, f2 item right)
delItem item = delete Farmer . delete item
addItem item = insert Farmer . insert item
直到where
声明结束,我都明白了一切,但我以前从未见过类似move f1 f2 item
声明的东西,我现在从 Haskell 开始。那是什么?像内联函数声明之类的东西?我只需要知道那是哪种陈述,我不是要你解释开发人员试图做什么(这是我的任务)。
谢谢
解决方案
也许看看一些更简单的例子,看看我们是否能弄清楚发生了什么
foo :: Int -> (Int, Int)
foo x = apply add sub x
where
apply f1 f2 someThing = (f1 x someThing, f2 x someThing)
add k = (+) (1) --<---------------^
sub s = (-) (10) -- <-----------------------------^
使用输入 5,这将给出输出 (6,5)。说“我想将 x 应用于某个函数”之类的内容通常很有用,其中该函数本身将其他函数作为输入。所以我们可以说更通用:这是一个函数,它与其他两个函数一起,给了我想要的输出。
在上面的简短示例中,我们说:“这是一个函数,它与其他两个函数一起,将这些函数与一些值一起应用以形成一对”。而且我们并不真正关心这些函数是什么,在这种情况下,我们使用了函数add
and sub
,但事实并非如此。