了解 Haskell callCC 示例

2023-12-23

我无法理解之前的答案question https://stackoverflow.com/questions/20451022/how-to-interpret-callcc-in-haskell。我希望以下的解释能够澄清一些事情。下面的例子来自完整的 https://www.fpcomplete.com/user/jwiegley/understanding-continuations

import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont

main = flip runContT return $ do
    lift $ putStrLn "alpha"
    (k, num) <- callCC $ \k -> let f x = k (f, x)
                               in return (f, 0)
    lift $ putStrLn "beta"
    lift $ putStrLn "gamma"
    if num < 5
        then k (num + 1) >> return ()
        else lift $ print num

输出是

alpha
beta
gamma
beta
gamma
beta
gamma
beta
gamma
beta
gamma
beta
gamma
5

我想我明白这个例子是如何工作的,但是为什么有必要有一个let表达于callCC“返回”延续,以便以后可以使用。因此,我尝试通过以下更简单的示例并对其进行修改来直接返回延续。

import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont

main = flip runContT return $ do
    lift $ putStrLn "alpha"
    callCC $ \k -> do
      k ()
      lift $ putStrLn "uh oh..."
    lift $ putStrLn "beta"
    lift $ putStrLn "gamma"

这打印

alpha
beta
gamma

我将其修改为以下内容

import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont

main = flip runContT return $ do
    lift $ putStrLn "alpha"
    f <- callCC $ \k -> do
      lift $ putStrLn "uh oh..."
      return k
    lift $ putStrLn "beta"
    lift $ putStrLn "gamma"

这个想法是继续将被返回为f并在我希望打印的测试示例中未使用

uh oh...
beta
gamma

但是这个例子无法编译,为什么不能这样做呢?

Edit:考虑方案中的类似示例。据我所知Scheme不会有问题,这是正确的吗?但是为什么呢?


正如其他人所写的那样,由于无限类型,最后一个示例不会进行类型检查。

@augustss 提出了另一种解决这个问题的方法:

您还可以创建一个新类型,将无限(等)递归类型包装为(等)递归新类型。 – 2013 年 12 月 12 日 8 月 12:50

这是我的看法:

import Control.Monad.Trans.Cont
import Control.Monad.Trans.Class

data Mu t = In { out :: t (Mu t) }

newtype C' b a = C' { unC' :: a -> b }
type C b = Mu (C' b)

unfold = unC' . out
fold = In . C'

setjmp = callCC $ (\c -> return $ fold c)
jump l = unfold l l

test :: ContT () IO ()
test = do
    lift $ putStrLn "Start"
    l <- setjmp
    lift $ putStrLn "x"
    jump l

main = runContT test return

我想这就是@augustss 的想法。

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

了解 Haskell callCC 示例 的相关文章

  • 如何制作Applicative的固定长度向量实例?

    最近了解了推广 决定尝试写向量 LANGUAGE DataKinds GADTs KindSignatures module Vector where data Nat Next Nat Zero data Vector Nat gt gt
  • 在 Haskell 中将 Maybe Int 转换为 Int

    我正在编写以下代码 并希望找到框字符串中数字的索引 所以我用了findIndex但它返回Maybe Int值 而我只想要Int value 我怎样才能转换Maybe Int to Int值或者有什么方法可以提取Int from Maybe
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • Accelerate 和 Repa 是否有不同的用例?

    我一直在玩 Repa 和 Accelerate 它们都很有趣 但我不知道何时使用其中一个 何时使用另一个 他们是一起成长 是竞争对手 还是只是为了解决不同的问题 Repa 是一个用于高效数组构建和遍历的库 用 Haskell 编程并在 Ha
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析

随机推荐

  • 数组中的对象数组通过测试

    我有一个 NSArray 对象 它有一个属性id 然后我有另一个带有选择的 id 的 NSArray 我需要获取第一个数组中具有第二个数组中列出的 id 的所有对象 是否可以在没有 for 循环的情况下执行此操作 1 个 for 循环可以
  • 如何在 StackNavigator 中将参数传递到屏幕?

    我的反应本机代码 import React Component from react import AppRegistry ActivityIndicator StyleSheet ListView Text Button Touchabl
  • 如何为我的测验应用程序布局表单以及发布到哪里?

    我想我的问题有两个 现在我只是显示问题和答案 但没有给用户选择他或她的选择的选项 正确答案部分只是为了测试我是否可以正确设置哪些答案是正确的 我有调查 gt 问题 gt 答案的嵌套模型 调查 show html erb ol li clas
  • 在 MUI 数据网格中插入新行时如何自动递增行 id?

    我试图将行从 MUI Kit 插入到我的数据网格组件中 而不必处理我不需要但需要唯一的 id 我尝试根据以下内容增加 id 号rows length但由于某种原因我总是得到 0 这是我的代码 const initial rows GridR
  • Task.Run() 与 Async/Await

    我对我正在编写的一些代码有疑问 我对一些具有大负载的端点同步进行了 3 个调用 我不想等待这些有效负载 而是继续运行该方法 直到我需要来自这 3 个端点的值 我已经采取了这样的解决方案 我将调用 3 个服务端点的方法转换为异步方法 我使用以
  • 如何重命名一堆文件以消除引号

    我的 iomega NAS 使用类似 linux 的操作系统 上面有一堆备份文件 文件名中包含双引号 像这样 水 4 水 5 等等 不要问它们是如何到达那里的 它们最初是在 Mac 上创建的 当我尝试将文件复制到备份驱动器时 这会导致问题
  • numpy.array.tolist() 将 numpy.datetime64 转换为 int

    我有一个日期时间数组 需要将其转换为日期时间列表 我的数组如下所示 import numpy as np my array np array 2017 06 28T22 47 51 213500000 2017 06 28T22 48 37
  • 在 libpcap pcap_loop() 回调上传递参数

    因为我想做一些测试libpcap http www tcpdump org pcap htm和一个小型 C 程序 我试图将一个结构从 main 传递到 got packet 阅读 libpcap 教程后 我发现了这一点 pcap loop
  • Firebird 适合 ASP.NET 的嵌入式数据库吗?还有哪一个?

    为我的 asp net 应用程序寻找一个好的嵌入式数据库 同时尝试避免 SQLExpress 我需要它是一个可下载的文件 无需在服务器上安装 我找到了火鸟 但 根据这个 http en wikipedia org wiki Embedded
  • 为什么计算相对较小的数字(34+)的阶乘会返回 0?

    int n Convert ToInt32 Console ReadLine int factorial 1 for int i 1 i lt n i factorial i Console WriteLine factorial 此代码在
  • 张量,如何收集索引列表的值?

    t2 tf constant 0 11 2 3 4 5 61 7 8 9 10 11 12 13 14 15 16 17 18 19 valid mask t2 lt 10 validIndex tf where valid mask pr
  • 在导轨控制台中加载和使用夹具

    我想知道是否有办法在 Rails 控制台中加载和 或使用夹具 实际上 我想从我的装置创建一个用户users yml进行一些测试 而不必经历所有的 痛苦 User new name John email 每一次 我目前在测试环境 rails
  • 如何“wget”文本文件中的 URL 列表?

    假设我在一个位置有一个包含数百个 URL 的文本文件 例如 http url file to download1 gz http url file to download2 gz http url file to download3 gz
  • 加速 FFTW 修剪以避免大量零填充

    假设我有一个序列x n 这是K N很长而且只有第一个N元素不等于零 我假设N lt lt K 例如 N 10 and K 100000 我想通过 FFTW 计算这样一个序列的 FFT 这相当于有一个长度的序列N并有一个零填充K N Sinc
  • 如何在通知区域中不添加图标的情况下使用 Shell_NotifyIcon

    MSDN 的文档关于通知和通知区域 http msdn microsoft com en us library ee330740 28v VS 85 29 aspx为了显示通知 在通知区域中有一个图标的要求非常明确 要显示通知 你必须 通知
  • Python:解压缩 .zip 内的 .Z 文件

    我正在尝试解压缩一个 Alpha zip 文件夹 其中包含一个 Beta 目录 该目录包含一个 Gamma 文件夹 其中包含 a Z b Z c Z d Z 文件 使用 zip 和 7 zip 我能够提取 Z 文件中存储的所有 a D b
  • WebView 检测 iframe 中的点击

    我有一个 WebView 我正在其中加载加载一些内容的 javascript 该内容是带有 iframe 的 html 似乎 iframe 内的任何点击都不会触发对WebViewClient shouldOverrideUrlLoading
  • Pyomo:使用python脚本时,有没有快速的方法可以在解决ILP后显示目标值?

    我之前完成了ILP并且运行正常 opt SolverFactory glpk model AbstractModel model obj Objective variables constraints instance model crea
  • HTML 5 Canvas 和 Javascript:组合分层画布

    我想将不同画布上的图像 使用 z index 相互层叠 组合起来导出为一张图像 这可能吗 Same 如何在客户端将 div 保存为图像 其中 div 包含一个或多个 HTML5 canvas 元素 https stackoverflow c
  • 了解 Haskell callCC 示例

    我无法理解之前的答案question https stackoverflow com questions 20451022 how to interpret callcc in haskell 我希望以下的解释能够澄清一些事情 下面的例子来