过滤函数包含谓词中的另一个函数

时间:2013-03-30 16:49:36

标签: list haskell filter

我对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)

1 个答案:

答案 0 :(得分: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。使用这样巨大的元组通常被认为是一种不好的做法,并且通过函数签名的可读性,你可以看出原因。