如何使用replicateM?

use*_*201 5 haskell

如果这是一个愚蠢的问题,我刚刚开始学习对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)

那么,如何实现我想在这里做什么?

wit*_*wit 0

你错过了空格

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)