2013-03-30 96 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