当前位置: 首页 > 知识库问答 >
问题:

在Haskell中列出monad实例-为什么在绑定操作中使用concat?

羿博延
2023-03-14
    instance Monad [] where
    xs >>= f = concat $ map f xs
    return x = [x]
    fail _ = []
    (>>=) :: Monad m => m a -> (a -> m b) -> m b

返回到list实例。map f xsxs中的每个值使用函数f。所以映射(*2)[1,2,3]导致[2,4,6]。这就是我在这里想不想要的?在这里应该如何使用concatconcat的定义如下:

    concat :: [[a]] -> [a]

为什么在(>>=)-函数中会得到一个列表?是不是因为list是单子,我从该list中提取每一个值,然后将其提供给f,而map只获得单例输入?但是我如何迭代整个列表呢?“挑选每个值”在哪里发生?如果map将整个列表xs作为输入(这就是我的理解),为什么还要获得列表列表呢?

共有1个答案

郎慎之
2023-03-14

如果

x :: [a]
f :: a -> [b]

然后

map f :: [a] -> [[b]]
map f x :: [[b]]

因此,我们需要将后者扁平化为[b]。这是由concat完成的。

 类似资料:
  • 我安装了SpaceVim来测试它和< kbd >;(分号)不起作用。< code >:nmap;表示“未找到映射”。问题是我在源代码中找不到它的未映射位置。在vim中有不同的方法来重新映射/取消映射一个键吗?我应该如何找到这些方法?

  • 问题内容: 试图弄清楚React的基础知识。 查看此页面上的第二个示例:https : //facebook.github.io/react/ 我看到tick()函数设置Timer类的状态,将前一个值加1。 但是,当我尝试实现自己的简单Counter类时,它失败了,并且出现控制台错误,提示 无法读取未定义的setState属性。 一些谷歌搜索显示我必须将其绑定到增量函数。但是,为什么在我看到的第一

  • 问题内容: 现在,node.js支持ECMAScript Harmony生成器, 我们可以在Haskell中简洁地编写ala代码单子代码了: 在上面的代码中,有一个函数可用于创建 确定性 单子,例如: 您现在可以按以下方式使用: 上面的函数接受两个字符串,将它们转换为列表,然后压缩它们。如果有错误,则立即返回。它取决于以下功能: 我们对其进行测试,以检查其是否可以正常工作: 同样,我们可以创建任何

  • 我在读一篇循环队列文章,它提到了其他队列数据结构中的重新缓冲问题。 在标准队列数据结构中,每个出队列操作都会出现重新缓冲问题。这个问题可以通过将队列的前后端连接起来使队列成为循环队列来解决。循环队列是一种线性数据结构。它遵循FIFO原理。

  • 我正在尝试执行GET命令,以便我可以从服务器获取数据。下面的Curl适用于Postman。 在运行我的代码时,我能够获取会话ID。下一步是获取数据。但是当我执行GET时,我没有得到任何响应。相反,我得到一个错误,如下所示:“指定的值具有无效的HTTP标头字符。(参数'name')” 下面是我试图执行的C代码 问题:我没有收到来自服务器的响应,响应长度为零。 以下是答案:0 回答ErrorMessa

  • 我有一个非常简单的JSF 2/Facelets页面,如下所示: 支持bean提供了一个 消息。因此,在