按照我的理解forM
是一样的mapM
,唯一的争论是相反的.这是否意味着如果我反驳我给他们的论点,我可以forM
用a mapM
和其他方式替换每一个?
我在" learnyouahaskell "一书中学习过monads .在阅读了作者monad之后,我决定查看Control.Monad.Writer.Class的文档.
在那里,我看到他们也实现了listen
和pass
功能,但我无法理解它们的用途.有人可以给我一个很好的例子,这样我就能理解如何使用listen
和pass
?
我正在寻找一种更简洁的方法来编写一个函数,如果列表不包含它,就会向列表添加元素.或者如果列表确实包含它,则以其他方式删除它,我现在使用一个if
子句并且该函数正在运行.
但是我正试图找到一种更好的方法来解决这个问题.
这是我的代码:
removeElemOrAdd :: Eq a => a -> [a] -> [a]
removeElemOrAdd elem list = if (List.elem elem list)
then (filter(\x -> x /= elem) list)
else (elem:list)
Run Code Online (Sandbox Code Playgroud) 我正在制作一个扫雷(游戏)而不是使用列表作为表示,我使用不同的集合来保持按类型收集的单元格.
我正在尝试生成一个Map,它使用元组作为键(x坐标,y坐标)作为一对,例如像这样(0,0).地图的价值将是包含炸弹的邻居数量.例如(0,0)1意味着单元格(0,0)与炸弹有1个邻居.
虽然我在Map.empty上遇到错误,但我能够想出一个肮脏的方法来制作它.
错误
setTest.hs:57:70:
Couldn't match expected type `Map.Map (t0, t0) Int
-> Map.Map (t0, t0) Int'
with actual type `Map.Map k0 a1'
In the second argument of `createBoard', namely `Map.empty'
In the expression: createBoard listOfBombs Map.empty fieldList
In the expression:
let
fieldList = [... | x <- ..., y <- ...]
nrBombs = round $ fromIntegral (xCoord * yCoord) * 0.20
listOfBombs
= Set.fromAscList
(take nrBombs
$ nub $ randomRs ((0, 0), (xCoord, yCoord)) (mkStdGen seed))
in createBoard …
Run Code Online (Sandbox Code Playgroud)