如果这是一个愚蠢的问题,我刚刚开始学习对Haskell进行编码,如此道歉。我正在尝试通过使用[] monad重做8个皇后问题。这是代码,
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)]
Run Code Online (Sandbox Code Playgroud)
当我尝试
[[]]>>= replicateM 8 addqueen
Run Code Online (Sandbox Code Playgroud)
它不起作用,但是会产生以下错误:
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
Run Code Online (Sandbox Code Playgroud)
那么,如何实现我想在这里做什么?
你错过了空格
addqueen xs = [x:xs|x<-[1,2..8], not $ x `elem` xs
|| (any (\(index,q) -> abs (x-q) ==index) $ zip [1..] xs)]
Run Code Online (Sandbox Code Playgroud)
二、不要同时使用多个中缀函数
--this code is invalid:
[[]] >>= replicateM 8 $ addqueen -- read as [[]] >>= (replicateM 8 $) addqueen
Run Code Online (Sandbox Code Playgroud)
原因是: infixl 1 >>=和infixr 0 $
第三,如果您使用GHCi,请为“空”数据编写签名。
>([[]] :: [[Int]])>>= replicateM 8 addqueen
Run Code Online (Sandbox Code Playgroud)
您的代码有效
> [[]]>>= replicateM 8 addqueen
[[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]],[[1],[2],[3],[4],[5],[6],[7],[8]]]
Run Code Online (Sandbox Code Playgroud)