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

对于一般的可折叠函子,是否有一个等效的头/尾?

赵朝
2023-03-14

我想表达以下Haskell代码,只使用函子代数(即-不依赖于任何特定的容器类型,如list):

ys = zipWith (+) (head xs : repeat 0)
                 (tail xs ++ [y])
  1. 对于可折叠/可遍历的函子是否有一个一般的first和rest概念?
  2. 是否有一种公认的惯用方法,仅使用函子代数,来移动可折叠/可遍历函子的内容?(请注意,上面的计算可以用英语描述为:“从右边移入一个值,然后将左边的值加回新的第一个值。”)

共有1个答案

范甫
2023-03-14

问题的第一部分(将结构的第一个值与一件事结合起来,其余的保持不变)可以通过traversable以简单的方式完成。我们将使用state,用我们想要应用的函数启动它,然后立即将其修改为id

onlyOnHead :: Traversable t => (a -> a) -> t a -> t a
onlyOnHead f xs = evalState (traverse go xs) f where
    go x = do
        fCurrent <- get
        put id
        return (fCurrent x)

您可以使用类似的方法旋转元素:我们将旋转一个列表,并将其填充到状态中,作为从中提取元素的对象。

rotate :: Traversable t => t a -> t a
rotate xs = evalState (traverse go xs) (rotateList (toList xs)) where
    rotateList [] = []
    rotateList vs = tail vs ++ [head vs]

    go _ = do
        v:vs <- get
        put vs
        return v
 类似资料:
  • 问题内容: 我为一位同伴编写了一个网络刮板,以节省他的工作时间。它是使用,使用和打开Firefox浏览器编写的。 我已经在使用的Linux机器上亲自编写了此代码,因此Firefox实际上不会打开并干扰我的工作。 如何使其在Windows PC的虚拟显示器中运行? 问题答案: 您无法在Windows上运行的原因是PyVirtualDisplay使用Xvfb作为其显示,而Xvfb是X Window S

  • 可以编写一个可以折叠到迭代器上的常量函数吗?当我尝试时: 我发现一个编译器错误: 我假设我的匿名函数

  • 问题内容: 我刚刚开始学习SQLite。能够看到表格的详细信息(如MySQL的表格)会很高兴。不够好,因为它仅具有基本信息(例如,它不会显示列是否是某种字段)。SQLite有办法吗? 问题答案: 在SQLite的命令行实用程序有一个命令,显示你的创建语句。

  • 问题内容: 有没有类似于unix命令的Java库? 即: file命令是一个很好的工具。我需要一些可以告诉我文件是否确实是我想要的东西的东西。(即图片,文档等) 我知道我可以运行该命令,但是我正在寻找一个Java库,而不是运行实际的unix命令。 问题答案: 在Google上进行快速搜索(对于公认的非显而易见的) “ java魔术文件检测” 会弹出一个相当不错的文章,“从文件中获取Mime类型”,

  • 可用的查询功能有: 我已经测试了isEqualTo,如果我设置一个字符串传入,这可以很好地工作,但我不能让它与列表一起工作。在官方的Firebase文档中似乎有一个IN函数,该函数将提供最多10项: https://firebase.google.com/docs/firestore/query-data/queries#in_and_array-contains-any 谢谢

  • 问题内容: 我仍在寻找解决这个问题的理想方法。总而言之,我正在用Java对电源子系统进行建模,并且需要一个有向无环图(DAG)类型的容器来存储数据。 我在C ++的标准模板库(STL)中找到了我真正需要的东西。它是multiset,它支持为同一键存储多个数据值。我可以清楚地看到如何使用此数据结构来存储电源节点和键及其作为值的上游/下游连接。 我的客户对我用Java编写电源子系统模型有严格的要求,因