有没有办法像 withCString 一样链接函数?

2024-02-29

有没有办法链接像这样的函数withCString?我的意思是任何 函数看起来像f :: Foo -> (CFoo -> IO a) -> IO a.

例如,假设有一个函数cFunc :: CString -> CFoo -> CBar -> IO ()

通常,我会做类似的事情:

haskellFunc string foo bar =
  withCString string $ \ cString ->
    withCFoo foo $ \ cFoo ->
      withCBar bar $ \ cBar ->
        cFunc cString cFoo cBar

但我想做一些类似的事情:

haskellFunc = (withCString |.| withCFoo |.| withCBar) cFunc

使用一些适当的组合运算符|.|.

我正在编写带有大量 C 绑定的库,这个样板来自 经常。难道我做错了什么?


您可以使用Cont暗示应用 https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Cont.html为了创作这些a -> (b -> IO c) -> IO c功能:

import Control.Monad.Cont

haskellFunc :: String -> Foo -> Bar -> IO ()
haskellFunc string foo bar = flip runCont id $ 
    cFunc <$> 
      cont (withCString string) <*> 
      cont (withCFoo foo) <*> 
      cont (withCBar bar)

或者使用一些额外的语法:

haskellFunc' :: String -> Foo -> Bar -> IO ()
haskellFunc' string foo bar = flip runCont id $
    cFunc <<$>> withCString string <<*>> withCFoo foo <<*>> withCBar bar
  where
    f <<$>> x = f <$> cont x
    f <<*>> x = f <*> cont x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法像 withCString 一样链接函数? 的相关文章

  • Haskell Servant 和流媒体

    我正在尝试添加一个功能到我的servant服务器将从 Amazon S3 获取文件并将其流式传输回用户 由于文件可能很大 我不想将它们下载到本地然后将它们提供给客户端 我宁愿将它们直接从 S3 流式传输到客户端 I use Amazonka
  • 在 Haskell 中将 Maybe Int 转换为 Int

    我正在编写以下代码 并希望找到框字符串中数字的索引 所以我用了findIndex但它返回Maybe Int值 而我只想要Int value 我怎样才能转换Maybe Int to Int值或者有什么方法可以提取Int from Maybe
  • 我可以获得有关过度限制类型签名的警告吗?

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

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • 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 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 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
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将 num 的签名键入 double?

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

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • Haskell 泛化问题(涉及列表理解)

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

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序

随机推荐

  • 如何获取适用于 adMob 的测试广告横幅并测试插页式广告?

    我正在尝试设置 adMob 广告 我有两个问题 1 我是否正确使用了 adListener 接口 2 为什么我看不到插页式广告 让我们从 adListener 开始 据我从说明中了解到 adListener 是一个接口 所以我创建了一个界面
  • (iPhone) 我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗?

    我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗 一个问题是我无法获得声音持续时间 有什么方法可以获取持续时间 以便我可以动态创建循环声音的调度程序 据我所知 AudioService 没有内置循环和
  • 消息总线和消息队列理解

    我想知道我对消息总线和消息队列工作原理的理解是否正确 首先 我需要明确命名 服务巴士可以与以下互换使用消息总线 这是一种发布者 订阅者类型的系统 其中消息被添加到任意数量的发布者的消息集合中 并且任意数量的订阅者可以从中读取消息 到目前为止
  • Java 和 C++ 中的构建器?

    在谷歌的协议缓冲区 http code google com p protobuf API for Java 他们使用这些漂亮的构建器来创建对象 请参阅here http code google com apis protocolbuffe
  • 如何计算pandas中的逆累积和

    我正在尝试找到一种方法来计算熊猫的逆累积和 这意味着申请cumsum但从下到上 我面临的问题是 我试图找到西班牙每个月从上到下的工作天数 第一个工作天 1 第二个工作天 2 第三个工作天 3 等等 并且从下到上 最后一个工作日 1 前一天
  • FTYPE/ASSOC 优先级并从命令行添加到 OpenWithList

    不确定这是否属于超级用户 但这里似乎有一个 cmd exe 标签 所以这里 作为背景 我正在开发一个 Firefox 附加组件 顺便说一句 这个问题不需要 Firefox 的知识 因为 Firefox 附加组件可以调用命令行 该附加组件旨在
  • 在 C# 中覆盖图像图片框

    我正在做一个应用程序 我添加一个图片框以将图像添加到某些产品中 我有一个问题 我想编辑已添加到某个产品中的图像 我该怎么做 这是我的实际代码 private void pbImagenEquipo DoubleClick object se
  • 如何只读取文本文件每行的第一个单词?

    我想知道如何只能读取文本文件中每行的第一个单词 我尝试了各种代码并尝试更改代码 但只能设法从文本文件中读取整行 我使用的代码如下所示 QuizList with open Quizzes txt r as f for line in f Q
  • 在毕加索中加载实际图像之前模糊缩略图

    我正在使用 picasso 显示来自 URL 的图像 我在加载实际图像之前先显示缩略图 我想模糊该缩略图 我如何在 picasso 中实现 这是我的源代码 pb setVisibility View GONE Picasso with ge
  • 根据打字稿函数中的另一个参数限制一个参数的类型

    interface INavigation children string initial string function navigation children initial INavigation return null 我有一个类似
  • Java 中的 StAX XML 格式化

    是否可以使用 StAX 特别是 woodstox 使用换行符和制表符格式化输出 xml 即采用以下形式
  • sbt 0.13.8 URI 有一个权限组件

    在 sbt 项目中运行 sbt 时出现此错误 我有 JDK 8 和 sbt 0 13 8 我可以毫无问题地运行 activator 命令 但我需要 sbt 工作 因为我的 IDE IntelliJ IDEA 使用它来加载项目 E work
  • ebean 和 play 框架中的复合键

    我刚刚开始使用 Play 框架 完成教程 涵盖基本功能 后 我尝试在数据库和游戏之间设置连接 我的一个关系有模式 CREATE TABLE IF NOT EXISTS shop CatPath parentC INT NOT NULL ch
  • 即使使用 sudo,也无法以 +x 权限执行脚本文件

    我无法从已安装的分区运行脚本 我创建了一个基本的 Hello World 脚本 可以从我的主目录正常执行 但是当我将其移动到已安装的分区时 我无法执行该文件 ls l rwxr xr x 1 user user 31 Mar 4 21 33
  • -1103错误域= NSURLErrorDomain代码= -1103“资源超出最大大小”iOS 13

    当 iOS 13 上的响应较大 14kb 时 我们会遇到以下网络错误 1103 Error Domain NSURLErrorDomain Code 1103 resource exceeds maximum size 由于我们使用 Ala
  • ExtJS 中自动调整文本字段标签大小

    在 ExtJS 中 是否可以将文本字段的标签调整为最佳大小以使其文本适合一行 The labelWidth http docs sencha com extjs 4 1 1 api Ext form Labelable cfg labelW
  • 按字母顺序搜索名称的查询

    我已经用过LIKE条件 但它要求我将全名输入数据库才能找到名称 if searchby equals Name try Class forName sun jdbc odbc JdbcOdbcDriver System out printl
  • 即使忘记了“new”,我什么时候应该自动创建一个对象?

    假设我有以下对象构造函数 function Foo bar this bar bar 如果我在全局范围内运行该函数而不使用new关键字然后bar将被设置在任何范围内Foo 被称为 var foo Foo 42 console log bar
  • 为什么C风格的注释会让insert语句运行两次?

    长话短说 我开始遇到 ORA 00001 主键违规 我追踪到这个问题 因为我的一些INSERT INTO语句运行了两次 然后我发现有问题的命令之后有一个 C 风格的注释 WHENEVER SQLERROR EXIT FAILURE SET
  • 有没有办法像 withCString 一样链接函数?

    有没有办法链接像这样的函数withCString 我的意思是任何 函数看起来像f Foo gt CFoo gt IO a gt IO a 例如 假设有一个函数cFunc CString gt CFoo gt CBar gt IO 通常 我会