首页 > 解决方案 > 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 开始。那是什么?像内联函数声明之类的东西?我只需要知道那是哪种陈述,我不是要你解释开发人员试图做什么(这是我的任务)。

谢谢

标签: 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 应用于某个函数”之类的内容通常很有用,其中该函数本身将其他函数作为输入。所以我们可以说更通用:这是一个函数,它与其他两个函数一起,给了我想要的输出。

在上面的简短示例中,我们说:“这是一个函数,它与其他两个函数一起,将这些函数与一些值一起应用以形成一对”。而且我们并不真正关心这些函数是什么,在这种情况下,我们使用了函数addand sub,但事实并非如此。


推荐阅读