我正在读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代码吗?
答案 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的实现使用了每个的最后一个关联 索引。