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

問題は、フィルターのラムダ パラメーターを使用しておらず、代わりに外部関数のリストの先頭を参照していたことです。修正版は次のとおりです。

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 に答える