我总是觉得有一个函数或表达式需要在Haskell中使用列表(或数组,应用相同)的值以及索引,这很难.
我validQueens在这里尝试N皇后问题时写下了 ......
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
Run Code Online (Sandbox Code Playgroud)
我不关心使用索引,所有的加号和减号等.它感觉马虎.我想出了以下内容:
enumerate x = zip [0..length x - 1] x
validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
where l = enumerate x
Run Code Online (Sandbox Code Playgroud)
受到Python的启发enumerate(不是借用命令式概念必然是一个好主意).似乎在概念好,但snd和fst所有的地方还挺吮吸.至少乍一看,它在时间和空间上都是昂贵的.我不确定我是否更喜欢它.
简而言之,我对这两者都不满意
有没有人发现他们发现比上述任何一种更优雅的模式?如果没有,是否有任何令人信服的理由,上述方法之一是优越的?