作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始学习编写 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
这里是错误的选择:
Prelude Control.Monad> :t replicateM
replicateM :: (Monad m) => Int -> m a -> m [a]
Prelude Control.Monad> :t addqueen
addqueen :: [Int] -> [[Int]]
这意味着在表达式
replicateM 8 addqueen
,
addqueen
的类型与
m a
匹配, 给
m a ~ ([Int] -> [[Int]])
,即
m ~ ((->) [Int])
和
a ~ [[Int]]
.因此
replicateM 8 addqueen
的类型是
m [a] ~ ([Int] -> [[[Int]]])
.这不是你想要的。
(Monad ((->) [Int]))
”,请先尝试加载例如
Control.Applicative
,以引入
instance Monad ((->) r)
的定义。如果您使用的是旧版本的 GHC,则会发生这种情况)。
Prelude> :m +Control.Monad
Prelude Control.Monad> :t (>=>)
(>=>) :: (Monad m) => (a -> m b) -> (b -> m c) -> a -> m c
Prelude Control.Monad> :t foldl1 (>=>) $ replicate 8 addqueen
foldl1 (>=>) $ replicate 8 addqueen :: [Int] -> [[Int]]
Prelude Control.Monad> :t [[]] >>= ( foldl1 (>=>) $ replicate 8 addqueen )
[[]] >>= ( foldl1 (>=>) $ replicate 8 addqueen ) :: [[Int]]
g = foldl1 (>=>) $ replicate 8 addqueen
有其自身的意义。在 Prolog 中它是
a "goal"在初始解中添加 8 个皇后。我们使用
g
通过给它一个最初为空的解决方案,
[ [] ] >>= g
.
>=>
,这样定义
(m >>= a) >>= b === m >>= (a >=> b)
即
>=>
是一元函数的组合运算符. )
foldl (>>=) [[]] $ replicate 8 addqueen
, 使用基本的
monadic bind operator >>=
,但只能作为一个整体工作。
关于haskell - 如何使用replicateM解决八皇后问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988569/
我正在尝试创建一个允许用户输入字符串列表的函数。该函数获取长度并允许用户再输入 length-1 行。然后检查每条线以确保其与原始线的长度相同。但是,我遇到了一些问题,并且找不到解决方案。 问题是我可
F# 中的 ReplicateM(Haskell)是否有等效函数? 示例: replicateM 2 [1,2,3] = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3
我正在尝试学习如何在 Scala 中编写单子(monad)代码,但我想念 Haskell 将类型限制为属于声明函数类型的类型类的能力。 例如,我正在尝试在 Scala 中从 Control.Monad
我为一个编程问题提交的两份报告仅在一个表达式上有所不同(其中 anchors 是一个非空列表,(getIntegrals n) 是一个状态单子(monad)): Submission 1 . repl
我是一名优秀的程序员,十分优秀!