1

我有一个关于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)
4

1 回答 1

4

问题是您没有使用过滤器的 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。使用如此庞大的元组通常被认为是一种不好的做法,并且通过函数签名的可读性,您可以了解原因。

于 2013-03-30T17:09:13.143 回答