【问题标题】:filter function containing another function in predicate在谓词中包含另一个函数的过滤函数
【发布时间】:2013-03-31 01:15:16
【问题描述】:

我有一个关于filter 的问题。我怎样才能使我的函数 (manhattanDistance) 将获取列表中的每个元素并将其用于自身?你能解释一下它是如何实现的吗?

func :: [(Int,Int)] ->
        (Int, Int, [Char], [Char], [Char], [Char],
                   [Char], [Char], [Char], [Char]) ->
        [(Int,Int)]
func (x:xs) agent  = filter ((manhattanDistance x agentCoord(agent)) == 1) (x:xs)

【问题讨论】:

  • 那个类型签名太长了不容易理解。执行type Agent = (Int, Int, [Char], [Char], [Char], [Char], [Char], [Char], [Char], [Char]) 之类的操作并将类型签名更改为func :: [(Int, Int)] -> Agent -> [(Int, Int)]。更好的是,将Agent 设为正确的data 类型。

标签: list haskell filter


【解决方案1】:

问题在于您没有使用过滤器的 lambda 参数,而是引用了外部函数列表的头部。这是一个更正的版本:

func 
  :: [(Int, Int)] 
  -> (Int, Int, [Char], [Char], [Char], [Char], [Char], [Char], [Char], [Char]) 
  -> [(Int, Int)]
func xs agent = 
  filter (\e -> manhattanDistance e (agentCoord agent) == 1) xs

顺便说一句,您拥有的元组应该被规范化为 ADT。使用如此庞大的元组通常被认为是一种不好的做法,并且通过函数签名的可读性,您可以了解原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-03-26
    • 2018-05-02
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多