惰性评估与急切评估以及双链表构建

2024-02-11

我睡不着! :)

我用 Haskell 编写了构建双链表的小程序。基本语言的属性是惰性求值(请参阅下面的一堆代码)。我的问题是我可以在pure函数式语言与eager评价还是不评价?无论如何,有什么属性eager函数式语言必须能够构建这样的结构(杂质?)?

import Data.List

data DLList a = DLNull |
    DLNode { prev :: DLList a
           , x :: a
           , next :: DLList a
           }
  deriving (Show)

walkDLList :: (DLList a -> DLList a) -> DLList a -> [a]
walkDLList _ DLNull = []
walkDLList f n@(DLNode _ x _)  = x : walkDLList f (f n)

-- Returns first and last items.
makeDLList :: [a] -> (DLList a, DLList a)
makeDLList xs = let (first, last) = step DLNull xs in (first, last)
  where
    step prev [] = (DLNull, prev)
                         -- Here I use laziness. 'next' is not built yet, it's a thunk.
    step prev (x : xs) = let this = DLNode prev x next 
                             (next, last) = step this xs
                         in (this, last)

testList :: [Int] -> IO ()
testList l = let
    (first, last) = makeDLList l
    byNext = walkDLList next first
    byPrev = walkDLList prev last
  in do
    putStrLn $ "Testing: " ++ show l
    print byNext
    print byPrev

main = do
  testList []
  testList [1, 2, 3, 4]

双向链表可以用 Eager 语言以纯函数方式实现,如zipper http://learnyouahaskell.com/zippers在单链表上。例如,参见Rosetta 代码 > 双向链表 > OCaml > 函数式 http://rosettacode.org/wiki/Doubly-linked_list/Element_definition#Functional.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

惰性评估与急切评估以及双链表构建 的相关文章

随机推荐

  • Google Sheets v4 更新效果 JSON 端点数据?于 2021 年 6 月 8 日关闭

    我读了这个article https developers google com sheets api v3关于 Google Sheet API v4 更新 我需要改变当前的代码结构吗 我在用简单的 JSON 数据 https sprea
  • Java中的LinkedListNode是什么

    请原谅我的无知 但我正在开始准备我的第一次技术面试 并在主题链接列表上遇到了这个问题和答案 问题 实现一种算法来删除单个链表中间的节点 并且只能访问该节点 public static boolean deleteNode LinkedLis
  • 使用 JavaScript 循环移动 Div

    是否可以使用 JavaScript 循环旋转 Div 我的 HTML 页面中有四个 DIV 我需要循环旋转这些 DIV 其实并不难 function moveDiv t mdiv t t 0 05 time var r 10 radius
  • srand(time(NULL)) 生成类似的结果[重复]

    这个问题在这里已经有答案了 我不明白为什么 srand 生成如此相似的随机数运行之间 我正在尝试运行以下代码 srand time NULL int x rand cout lt lt x lt lt endl 然而 我最终得到的不是一个适
  • JSF:将字符串添加到列表中

    我有一个 JSF 2 0 应用程序 它有一个保存字符串列表的 bean 我想添加字符串
  • 修饰类或参数意味着什么?

    装饰或向类或参数添加属性意味着什么 目的是什么以及我什么时候这样做 欢迎提供资源链接和直接答案 当您在 C 中添加装饰器时 就像向类 方法添加属性一样 它会附加一个属性 如果你编写单元测试你会遇到一个简单的装饰器TestMethod像那样
  • Google Cloud Run 内存限制是否适用于容器大小?

    对于云运行的内存使用情况 请参阅文档 https cloud google com run docs configuring memory limits https cloud google com run docs configuring
  • IronPython WPF 与 RevitPythonShell

    我根据我在 stackoverflow 上找到的代码片段编写了此脚本 但在运行时出现此错误 System InvalidOperationException 无法创建多个 同一 AppDomain 中的 System Windows App
  • 渲染传递局部变量的模板时出现问题

    我正在运行 Ruby on Rails 3 我想渲染一个模板 show html erb 传递局部变量 In RAILS ROOT views users show html erb I have Name Surname 我还有一个页面控
  • xna 中的大型多人游戏

    您对 xna 和大型多人游戏有何看法 例如服务器和 100 个客户端 有没有关于如何在 xna 中创建客户端服务器应用程序的好教程 当然有关于如何做到这一点的教程 我个人使用 Lidgren 作为我的在线原型 我只对 4 个人进行了测试 服
  • 在EF Core中,如何检查是否需要迁移?

    我在 Xamarin iOS 应用程序中使用 Entity Framework Core 在我的核心项目中 包含在 iOS 应用程序和其他应用程序之间共享的代码 netstandard 2 0 我想知道是否需要迁移 以便我也可以执行一些其他
  • 递归删除以

    我需要在 bat 文件中编写一个命令 递归删除以某个字符串开头的所有文件夹 我怎样才能做到这一点 这是您正在寻找的完整答案 FOR D R X IN certain string DO RD S Q X 显然你需要更换的地方certain
  • 如何在 Matlab fitglm 中获得 R 的零偏差和残差偏差等值?

    在 R 中 拟合 glm 后 您可以获得包含残差偏差和零偏差的摘要信息 这些信息告诉您您的模型与仅包含截距项的模型相比有多好 例如模型 model lt glm formula am mpg qsec data mtcars family
  • 如何编写 azure 函数来触发 azure devops 管道?这可能吗?

    我正在尝试设置一个可以触发 Azure DevOps 构建管道的 Azure 函数 但我不确定如何继续下去 以及是否有可能这样做 我已经有一个可供使用的构建管道 但无法使用 Azure DevOps 已提供的传统触发器 我不能透露原因 但我
  • JQuery - 在第 3 方表单上预填充表单字段

    我的网页上有一个 Netresults 表单 需要预先填充 该表单是使用 javascript 插入到页面中的 因此我无法在源代码中看到表单字段 如果表单位于我的页面上 我将使用以下代码 但由于它不在我的页面上 我不知道如何定位这些字段 有
  • Fuseki 1.0.1 SPARQL 更新返回 404

    我正在尝试学习更新 Fuseki 中的数据 但当我尝试时出现 404 错误 我显然没有做正确的事情 也许这是我的 INSERT 命令 不过我已经尝试过很多了 我正在使用 sparql tpl 上基于 Web 的 SPARQL 界面 我可以让
  • 如何使用自定义 webpack 加载器生成自定义源映射?

    在编写自定义加载程序时 我一直在尝试生成自定义源映射 我的 来源 是几行文字 this is my log lines 我写了一个加载器将其转换为 exports printAll function console log this con
  • 如何解决 Bot Framework Channel Emulator 中的“500 内部服务器错误”错误?

    我正在研究Bot框架技术 最近微软发布了新版本 V3 的bot 我已经使用旧版本开发了机器人 现在我正在尝试将我的机器人升级到新版本 为此 一切正常 但在将我的机器人发布到azure后 然后通过使用发布URL 我尝试在机器人框架通道模拟器
  • GetSubKeyNames 不返回所有键

    我想将软件安装在客户端上 我也使用 WMI 和注册表 我在下面找到了大部分信息HKLM 软件 微软 WINDOWS 当前版本 卸载 然而 例如 Dropbox 并没有出现在那里 Dropbox 位于HKCU所以我也想读这些键 我想很简单 因
  • 惰性评估与急切评估以及双链表构建

    我睡不着 我用 Haskell 编写了构建双链表的小程序 基本语言的属性是惰性求值 请参阅下面的一堆代码 我的问题是我可以在pure函数式语言与eager评价还是不评价 无论如何 有什么属性eager函数式语言必须能够构建这样的结构 杂质