2017-02-03 1 views
0

В следующем коде, что означает m!!i!!j? Любые примеры будут полезны.Haskell !! операторская комбинация

matrixElements :: [[t]] -> [t] 
matrixElements m = 
    [m!!i!!j | i<-[0..length m - 1], 
       j<-[0..length(head m) - 1], 
       even(i + j)] 

main = assertEqual [1,3,5,7,9] $ matrixElements [[1,2,3], [4,5,6], [7,8,9]] 
+0

[ '(!!) :: [а] -> Int -> a'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:-33--33-) принимает список и индекс и возвращает элемент списка на индекс. – sjakobi

+2

Может быть лучше написано как '[x | (i, row) <- zip [0 ..] m, (j, x) <- zip [0 ..] row, even (i + j)] '. – Ryan

+0

Пожалуйста, см. Тег haskell [info section] (http://stackoverflow.com/tags/haskell/info) – jberryman

ответ

3

Это зависит от того, что импортировано. There are many functions named (!!).

Скорее всего, это относится к the one in Prelude:

(!!) :: [a] -> Int -> a

Индекс списка (индекс) оператора, начиная с 0. Это пример более общего genericIndex, который принимает индекс любого интеграла тип.

Некоторые простые примеры:

  • "abcde" !! 2 == 'c'
  • ["zero", "one", "two", "three"] !! 2 == "two"
  • [0..99] !! 24 == 24
+0

Я понял это Спасибо :) – user7054784

+0

Прелюдия '!!' на этой странице результатов является единственной, которая даже удаленно распространенный, fwiw – luqui