2014-10-27 1 views
0

Я читаю книгу под названием Algorithms - Functional Programming Approach от Fethi Rabhi и Guy Lapalme. Я не понимаю часть кода с синтаксисом вроде //.Не могу понять // в понимании списка

type Position = (Int,Int) 
type Board = Array Int Position 

mandist :: Position -> Position -> Int 
mandist (x1, y1) (x2, y2) = abs (x1-x2) + abs(y1-y2) 

allMoves :: Board -> [Board] 
allMoves b = [b//[(0,b!i),(i,b!0)] 
    | i <- [1..8], mandist (b!0)(b!i) == 1] 

Не могу понять, что allMoves делает. Может кто-нибудь объяснить мне или превратить это в список кодов монады с обозначением?

+3

см http://hackage.haskell.org/package/array-0.5.0.0/docs/Data-Array.html#v:-47--47- – ymonad

+4

И, в частности, [Hoogle] (HTTP : //www.haskell.org/hoogle/? hoogle =% 2F% 2F) или [Hayoo '//'](http://hayoo.fh-wedel.de/?query=%2F%2F). Это не специальный синтаксис, а просто пользовательский оператор. Если вы снова столкнетесь с такими символами, просто спросите поисковые системы! – leftaroundabout

+1

Может кто-то из вас сделать это в ответ, пожалуйста? – Carsten

ответ

1

(//) является оператором от Data.Array (это не какой-то экзотический синтаксис Haskell, просто регулярная функция инфикса).

Это выглядит следующим образом: (//) :: Ix i => Array i e -> [(i, e)] -> Array i e
И это документация для него:

Формирует массив, идентичный первому аргументу, за исключением, что он был обновлен ассоциациями из правого аргумента. Например, если т является 1-происхождения, п на п матрицы, то

m//[((i,i), 0) | i <- [1..n]] это та же матрица, кроме как с диагонали на нулевую отметку.

Повторяющиеся индексы в ассоциативном списке обрабатываются как для массива: Haskell 2010 указывает, что результирующий массив не определен (то есть снизу), но реализация GHC использует последнюю ассоциацию для каждого индекса.