小编use*_*015的帖子

用高阶函数替换显式递归

我有以下代码,它被设计为获取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)

recursion haskell

5
推荐指数
1
解决办法
509
查看次数

意外的模式匹配行为

这是我的代码的简化版本:

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.

任何人都可以解释发生了什么,并建议一种方法来解决它?

haskell

4
推荐指数
1
解决办法
188
查看次数

Agda 类别库的背景?

我正在尝试了解类别库,但我对 Agda 相当陌生,因此我正在寻找某种文档来解释在库的实现中所做的选择。自述文件中有一个指向此类内容的链接,但已损坏。

agda category-theory

4
推荐指数
1
解决办法
162
查看次数

寻找mapAccumLM

我正在寻找一种在IO monad中使用mapAccumL的方法 - 类似于mapM的模拟,即使用这种类型的签名:

mapAccumLM :: (Monad m) => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])

有什么简单的方法吗?

haskell

0
推荐指数
1
解决办法
213
查看次数

标签 统计

haskell ×3

agda ×1

category-theory ×1

recursion ×1