2013-03-30 99 views
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) 
+3

该类型签名太长而不易理解。做类似'类型代理=(Int,Int,[Char],[Char],[Char],[Char],[Char],[Char],[Char],[Char])并且改变类型签名到'func :: [(Int,Int)] - > Agent - > [(Int,Int)]'。更好的是,使'Agent'成为一个适当的'data'类型。 – dave4420

+0

是的,你是对的! – nurgasemetey

回答

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。通常认为使用如此巨大的元组是不好的做法,并且通过函数签名的可读性可以看出原因。

+0

谢谢,它真的帮助我! – nurgasemetey