2014-10-27 76 views
0

我正在阅读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代码和符号吗?

+3

参见http://hackage.haskell.org/package/array-0.5.0.0/docs/Data-Array.html#v:-47--47- – ymonad 2014-10-27 07:54:19

+4

并且特别地,[Hoogle](http ://www.haskell.org/hoogle/?hoogle =%2F%2F)或[Hayoo'//'](http://hayoo.fh-wedel.de/?query=%2F%2F)。这根本不是特殊的语法,只是一个自定义的操作符。如果你再次遇到这样的符号,只要问问搜索引擎! – leftaroundabout 2014-10-27 07:54:56

+1

请问你们有人可以把它变成答案吗? – Carsten 2014-10-27 07:59:27

回答

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的实现使用每个 索引的最后一个关联。