【问题标题】:haskell Chess Knight Tour: Function composition [closed]haskell Chess Knight Tour:功能组合
【发布时间】:2016-08-03 16:43:34
【问题描述】:

我很难理解一个国际象棋骑士问题 功能组成。练习是一个生成器/过滤器/选择器 具有给定包装函数 (knightProblem) 的链,它将所有内容粘合在一起。

我不清楚作为链中第一部分的函数 kGenerator 应该如何处理多个参数:

-- Chess Knight Problem: Generate all Knight moves of length NrMoves -- that end at the target position knightProblem :: StartPos -> NrMoves -> TargetPos -> [Moves] knightProblem = kSelector . kFilter . kGenerator -- kGenerator: needs StartPos, NrMoves, generates all sequences of length NrMoves -- kFilter: remove all moves which contain invalid positions -- kSelector: keep all moves which terminate at TargetPos kGenerator :: ??? ???

我正在寻找有关如何处理此类问题的提示。

最好的问候。

【问题讨论】:

    标签: haskell chess function-composition dot-operator


    【解决方案1】:

    尝试写下其他函数的类型签名。

    -- kSelector: keep all moves which terminate at TargetPos
    -- something like
    kSelector :: Position -> [Moves] -> [Moves]
    
    -- kFilter: remove all moves which contain invalid positions
    -- something like
    kFilter :: [Moves] -> [Moves]
    

    所以看起来kGenerator 应该为kFilter 提供[Moves]

    kGenerator :: Position -> [Moves]
    

    想想[Moves] 是什么;这很可能类似于[[Position]],一个代表移动链的位置列表列表。

    从给定位置生成移动的一种明显方法是执行 8 种可能的移动,然后从这些位置中的每一个递归生成更多移动。

    希望这能帮助你完成任务:)

    【讨论】:

    • 感谢 9000。我的重点是“不可变” knightProblem = kSelector 。过滤器。 k生成器链方程。我只是通过引入复合数据类型来“解决”这个问题,这样每个组件函数都只有一个参数,比如 kGenerator :: Job -> ...,但这是一个不同的问题,而不是指定的问题 :)
    • 如果需要,您可以“通过”函数传递参数而不更改它。例如,kFilter 可以接受元组(Position, [Moves]) 并返回(Position, [Moves]),只需将位置传递给需要它的kSelector
    猜你喜欢
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多