【发布时间】:2013-09-24 17:48:47
【问题描述】:
我刚开始学习编写 Haskell 代码,如果这是一个愚蠢的问题,我深表歉意。我试图通过使用[] monad 来重做八皇后问题。这是代码,
import Control.Monad
addqueen :: [Int] -> [[Int]]
addqueen xs = [ x:xs | x <- [1,2..8],
not $ x `elem` xs
|| (any (\ (index,q) -> abs (x-q) == index) $ zip [1..] xs) ]
当我尝试时
[[]] >>= replicateM 8 addqueen
它不起作用,但会产生以下错误:
Couldn't match expected type `t0 -> t1' with actual type `[[a0]]'
The first argument of ($) takes one argument,
but its type `[[a0]]' has none
In the expression: [[]] >>= replicateM 8 $ addqueen
In an equation for `it': it = [[]] >>= replicateM 8 $ addqueen
那么我如何在这里实现我想要做的呢?
【问题讨论】:
-
目前还不清楚您希望
[[]]>>= replicateM 8 addqueen做什么。请注意,[[]] >>= f等于f []。 -
我可以得到结果,如果我这样做 "[[]]>>=addqueen >>=addqueen >>=addqueen >>=addqueen >>=addqueen >>=addqueen >>=addqueen > >=addqueen" 但这真的很乏味。我正在寻找一种“语法糖”来简化调用。
-
如果我没记错的话,看起来像
iterate (>>= addqueen) [[]] !! 8。 -
啊,这就像一个魅力!谢谢哥们!
-
foldl (>>=) [[]] $ replicate 8 addqueen
标签: haskell monads type-mismatch n-queens replicate