如何在 Haskell 中连接变量参数?

2024-03-12

Shell-monad 支持可变参数 https://hackage.haskell.org/package/shell-monad-0.6.9/docs/Control-Monad-Shell.html#t:CmdParams,但是我找不到一种方法来传递此类参数的列表以进行追加。可能可以使用该库中存在的函数构造来解决问题,但我想问一下一般问题。

我模糊地理解“varargs”机制是通过函数组合实现的,并且通过使用类型类推断来终止递归。

以该库为例,我想知道是否可以将参数视为“第一类”,例如将两个参数分配给一个变量。

这是一个(不正确的)示例,显示了我的意图。

Prelude Control.Monad.Shell Data.Text> f xs = cmd "cat" xs
Prelude Control.Monad.Shell Data.Text> let a = static ("a" :: Text)
Prelude Control.Monad.Shell Data.Text> let a2 = [a,a]
Prelude Control.Monad.Shell Data.Text> f a2

<interactive>:42:1: error:
    • Could not deduce (Param [Term Static Text])
        arising from a use of ‘f’
      from the context: CmdParams t2
        bound by the inferred type of it :: CmdParams t2 => t2
        at <interactive>:42:1-4
    • In the expression: f a2
      In an equation for ‘it’: it = f a2

没有什么是一点多态递归不能解决的:

cmdList :: (Param command, Param arg, CmdParams result) =>
    command -> [arg] -> result
cmdList command = go . reverse where
    go :: (Param arg, CmdParams result) => [arg] -> result
    go [] = cmd command
    go (arg:args) = go args arg

在 ghci 中尝试一下:

> Data.Text.Lazy.IO.putStr . script $ cmdList "cat" ["dog", "fish"]
#!/bin/sh
cat dog fish

它需要给出的所有参数cmdList具有相同的类型,尽管它仍然接受之后不以列表形式存在的其他类型的附加参数。

如果您愿意打开扩展程序,您甚至可以让它接受多个位置的列表,每个位置可能有不同的类型。

list :: (Param arg, CmdParams result) =>
    (forall result'. CmdParams result => result') ->
    [arg] -> result
list f [] = f
list f (arg:args) = list (f arg) args

使用它的一个例子:

> T.putStr . script $ list (list (cmd "cat") ["dog", "fish"] "bug") ["turtle", "spider"]
#!/bin/sh
cat dog fish bug turtle spider

以前的cmdList可以定义为cmdList command = list (cmd command). (N.B. cmdList = list . cmd does not work!)

接受包含不同类型的列表会产生更多噪音,但对于存在类型来说是可能的。

data Exists c where Exists :: c a => a -> Exists c

elist :: CmdParams result =>
    (forall result. CmdParams result => result) ->
    [Exists Param] -> result
elist f [] = f
elist f (Exists arg:args) = elist (f arg) args

但看看使用起来有多么烦人:

> T.putStr . script $ elist (cmd "cat") [Exists "dog", Exists "fish"]
#!/bin/sh
cat dog fish

以前的list可以通过它来定义list f = elist f . map Exists.

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

如何在 Haskell 中连接变量参数? 的相关文章

  • 如何使用va_start()?

    在具有可变参数的函数中 我们使用函数 va start 初始化 va list ap 类型的对象 如下所示 void va start va list ap parmN 我不明白1 什么类型的对象可以作为 parMN 最后一个已知参数 传递
  • C++ 中的可变参数函数声明中省略了逗号

    我习惯于这样声明可变参数函数 int f int n 读书时C 编程语言我发现书中的声明省略了逗号 int f int n the comma has been omitted 这个语法似乎是 C 特定的 因为当我尝试使用 C 编译器编译它
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

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

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

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier

随机推荐

  • Playframework 2.0.x 是否支持模板中的

    不知道play 2 0 3及更高版本是否支持else if在视图中 我只读到必须这样编码 if else if else 不敢相信 我在第二个 if 之前使用了 if true else if true else
  • 使用 nltk 没有上下文的词性标记

    有没有一种简单的方法来确定给定单词最可能的词性标签没有上下文使用nltk 或者如果不使用任何其他工具 数据集 我尝试使用 wordnet 但似乎 sysnet 不是按可能性排序的 gt gt gt wn synsets says Synse
  • Android计算器-Editview无法输入小数位

    我是Android代码开发新手 我正在开发一个Android计算器应用程序 不明白为什么两个EditText 第一个输入和第二个输入 不能接受小数位而只能输入整数 附如下是代码 Thanks 主要活动 package com trial j
  • 将 ScriptableObjects 加载到单个预制件/多个预制件的最佳实践是什么?

    脚本化对象 SO 我最近一直在尝试了解 ScriptableObjects 并在 Unity 中建立了一个项目 我只想射击生成的传入敌人 我已经设置了它 这样我就可以通过 SO s 创建不同的敌人 但注意到我仍然需要为每个敌人创建一个预制件
  • 我们可以简化这个字符串编码代码吗

    是否可以将此代码简化为更干净 更快的形式 StringBuilder builder new StringBuilder var encoding Encoding GetEncoding 936 convert the text into
  • 当有人加入时创建规则协议

    我想要一个机器人将新成员设置为只能查看一个频道并且必须就规则达成一致才能使用服务器的角色 我已经写了这个来做到这一点 但我不断收到此错误 Ignoring exception in on member join Traceback most
  • 仅来自 Sharepoint 列表的自定义字段

    是否可以循环访问共享点列表的字段集合并仅检索我们的自定义字段而不是共享点内置字段 using SPSite site new SPSite http localhost using SPWeb web site OpenWeb SPList
  • 如何实现带进度条的闪屏? - 安卓

    我在启动时有一个闪屏 与以下编码 public class Splash extends Activity Override protected void onCreate Bundle savedInstanceState TODO Au
  • 检查用户是否在 C 中输入字母或数字

    有没有一种简单的方法来调用 C 脚本来查看用户是否输入了英文字母表中的字母 我在想这样的事情 if variable a z printf You entered a letter You must enter a number else
  • Mysql 读锁 SELECT FOR UPDATE

    EDIT I use Node js felixge mysql https github com felixge node mysql pooling connections并有一个poolmysql 连接数 ORIGINAL 我有一个
  • APK 安装失败:[INSTALL_FAILED_VERIFICATION_FAILURE]

    我正在尝试在运行 Jelly Bean 4 2 AOSP 版本的设备上安装 APK 当我 adb install my apk 时 出现错误 安装 失败 验证 失败 我尝试使用 testsign jar 来 签名 apk 但它不会改变结果
  • RegExpValidator 无法正确验证 URL 模式

    The URL http www ftd de rss2 http www ftd de rss2当我在这个 不冒险的 中对照下面的正则表达式检查它时 它是无效的
  • aapt.exe'' 以非零退出值 1 完成

    我有问题 当我运行我的应用程序时写 Error Execution failed for task app processDebugResources gt com android ide common process ProcessExc
  • 如何从命令行启动SVN项目?

    因此 我在本地计算机上创建了一个 Ruby on Rails 应用程序 我有一个我创建的远程存储库 现在我如何第一次签入 我以前从未创建过自己的svn项目 所以我不知道该怎么做 我只对我从事过的项目做出了承诺 解决方案 cd my proj
  • jQuery mouseoverIntent 不起作用,但悬停可以

    我有以下代码 document ready function yearInner hide year this hover function yearInner this slideToggle 它隐藏了带有 YearInner 类的 di
  • 如何删除选取框中的尾随空格?

    我开发了一个不断向上移动的大帐篷 但确切的问题是 在滚动完最后一个图像后 第一个图像和最后一个图像之间存在巨大的差距 我只想删除附加到最后一张图像底部的尾随空格 有没有人帮我找出解决方案 提前致谢 HTML div style margin
  • @font-face 在 Firefox 中不起作用?

    这是由 FontSquirrel 生成的代码 在所有其他浏览器 包括 IE 中都可以正常工作 但在强大的 Firefox 中却不行 我究竟做错了什么 ps 我使用的是FF3 5 如果您无法查看我的示例 请参阅以下来源
  • Android手机休眠时网络访问

    我正在使用警报组合 设置为AlarmManager 和后台服务定期同步我的应用程序中的数据 我遇到的唯一问题是 当睡眠策略终止 Wi Fi 连接时 同步将不再起作用 有没有办法 唤醒 已进入睡眠状态的 Wi Fi 连接 GMail 以某种方
  • XA/JTA 事务还在使用吗?

    我有一个与多个数据库和一些自定义服务交互的应用程序 对于某些操作 我需要类似事务的行为 其中一组更改要么跨所有数据库 服务提交 要么在发生错误时全部回滚 X Open 组的 XA 标准和 Java JTA 似乎使用两阶段提交过程正好解决了这
  • 如何在 Haskell 中连接变量参数?

    Shell monad 支持可变参数 https hackage haskell org package shell monad 0 6 9 docs Control Monad Shell html t CmdParams 但是我找不到一