在列表理解中无法理解//

时间:2014-10-27 07:48:54

标签: haskell

我正在读Fethi Rabhi和Guy Lapalme撰写的一本名为Algorithms - Functional Programming Approach的书。我不会理解使用//等语法的代码部分。

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正在做什么。有人可以解释我,或者用编号将其变成列表monad代码吗?

1 个答案:

答案 0 :(得分:1)

(//)是来自Data.Array的运算符(它不是一些Haskell异类语法,只是常规的中缀函数)。

看起来像这样:(//) :: Ix i => Array i e -> [(i, e)] -> Array i e
这是它的文档:

  

构造一个与第一个参数相同的数组,除了它有   在正确的论证中由协会更新。例如,   如果m是1原点,n乘n矩阵,那么

     

m//[((i,i), 0) | i <- [1..n]]是相同的矩阵,除了   对角线归零。

     

关联列表中的重复索引按数组处理:   Haskell 2010指定结果数组未定义(即   但是GHC的实现使用了每个的最后一个关联   索引。