我有以下代码,它被设计为获取a
's 的列表,以及's的列表b
,并返回所有配对[(a,b)],这样
a
和每个b
只在每个配对出现一次.(a, b)
符合一些条件cond
,即cond :: a -> b -> Bool
.例如,列表[1,2] [x,y,z]的结果应该是
[[(1, x), (2, y)]
[(1, x), (2, z)]
[(1, y), (2, x)]
[(1, y), (2, z)]
[(1, z), (2, x)]
[(1, z), (2, y)]]
Run Code Online (Sandbox Code Playgroud)
这是一些(有点抽象的)代码,它使用显式递归来完成工作,但我想用折叠或类似的东西替换它.有小费吗?
someFn :: [a] -> [b] -> [ [(a, b)] ]
someFn [] _ = []
someFn (a : as) bs = [ [(a,b)] ++ rest | b <- …
Run Code Online (Sandbox Code Playgroud) 这是我的代码的简化版本:
data Exp = Var String
test :: Exp -> String -> Bool
test e vIn = case e of
Var vIn -> True
_ -> False
Run Code Online (Sandbox Code Playgroud)
当我运行这个:
test (Var "X") "Y"
Run Code Online (Sandbox Code Playgroud)
我得到True,这很奇怪,因为它需要匹配(Var vIn)和(Var s),s~ = vIn.
任何人都可以解释发生了什么,并建议一种方法来解决它?
我正在尝试了解类别库,但我对 Agda 相当陌生,因此我正在寻找某种文档来解释在库的实现中所做的选择。自述文件中有一个指向此类内容的链接,但已损坏。
我正在寻找一种在IO monad中使用mapAccumL的方法 - 类似于mapM的模拟,即使用这种类型的签名:
mapAccumLM :: (Monad m) => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])
有什么简单的方法吗?