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