使用列表的内容作为单个多参数函数的位置参数

2024-04-04

是否有一个标准的 Haskell 函数(或模式)来提取列表的内容并将它们提供给函数,就好像它们是函数的有序位置参数一样?

例如,考虑函数(,)当给定两个位置参数时,将从它们中生成一个二元组:

(,) 3 4 --> (3,4)

假设我有一些我无法更改的外部函数调用给我的参数,表示为列表[3, 4].

是否有“内容”操作,这样就可以工作:

(,) $ contents_of [3, 4]

使得动作contents_of行为就像这些项目被放置在源代码中一样,它们之间有空格作为函数应用程序?

例如,(,) $ contents_of [1]应该是柯里化函数((,) 1)然后又需要一个参数来完成元组的创建。

我的一个想法是尝试将函数折叠到列表上,用折叠函数表达柯里化:

foldr (\x y -> y x) (,) [3, 4]

但看看类型签名foldr:

foldr :: (a -> b -> b) -> b -> [a] -> b

让这看起来很困难。b这里需要是函数类型本身,但是当它被应用于参数时,它不会是具有相同类型签名的函数b太长了,会导致折叠中的类型问题。

这在本质上与 Python 类似*args构造。

我不关心这可能暗示的严格性属性——只关心这样的事情在标准 Haskell 中是否可能。


可以像这样表示 N 元函数:

data FunN r a = FunN Int (a -> FunN r a) | FNil r

然后将普通函数转换为FunN:

f2FunN :: (FunN (a->b) a) -> FunN b a
f2FunN (FNil g)   = FunN 1 (FNil . g)
f2FunN (FunN n g) = FunN (n+1) (f2FunN . g)

然后应用参数列表:

a :: FunN b a -> [a] -> b
a (FNil r)   []    = r
a (FunN _ f) (x:t) = a (f x) t
a _          _     = error "wrong arity"

例如:

Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1,2]
3
Prelude> a (f2FunN $ FNil (+)) [1] 2
3
Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1,2,3]
*** Exception: wrong arity
Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1]
*** Exception: wrong arity

但是当然,您需要在编译时知道函数的数量 - 这样您就知道可以使用该函数包装多少次f2FunN.

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

使用列表的内容作为单个多参数函数的位置参数 的相关文章

  • Haskell - 无法将类型“PersistEntityBackend record0”与“SqlBackend”匹配

    我正在尝试通过 Yesod 中的 id 获取记录 我的代码是 getEditActorR Handler Html getEditActorR do actorId lt runInputGet ireq intField id actor
  • Haskell 错误:“非详尽模式”

    所以我有这个功能 当我尝试像这样使用它时 合并排序列表 1 1 1 1 它给了我一个错误 1 1 例外 SortFunctions hs 86 1 91 89 非详尽 函数 mergeSortedLists 中的模式 85 mergeSor
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 按广度优先顺序列出目录所有内容导致效率低下

    我编写了一个 Haskell 模块来按广度优先顺序列出目录的所有内容 下面是源代码 module DirElements dirElem where import System Directory getDirectoryContents
  • Cabal 在 NixOS 上构建时找不到外部库

    我正在尝试使用 cabal2nix 在 NixOS 上构建一个内部 Haskell 项目 它包装 并因此依赖 一个外部库 在 Ubuntu 上可以通过以下方式构建 wget设置源 然后运行make make install ldconfig
  • 在 Haskell 中编写 Web 应用程序的最简单方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的项目中更多地使用 Haskell 并且我认为如果我可以开始将它用于 Web 应用程序 这将真正
  • 为什么 Point 和 Rectangle 不能用作可选参数?

    我试图将一个可选参数传递给一个几何函数 称为offset 可能会或可能不会指定 但 C 不允许我执行以下任何操作 有办法做到这一点吗 默认为空 错误 类型的值无法用作默认参数 因为没有到 System Drawing Point 类型的标准
  • Bash:在新终端中执行带有参数的命令[重复]

    这个问题在这里已经有答案了 所以我想在 bash 中打开一个新终端并执行带参数的命令 只要我只采取类似的东西ls作为命令它工作正常 但是当我采取类似的东西时route n 所以带参数的命令不起作用 代码 gnome terminal win
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • 是否可以列出派生 Generic 的记录数据类型中字段的名称和类型?

    我知道对于派生 Data Data 的数据类型 constrFields http hackage haskell org package base 4 7 0 2 docs Data Data html v constrFields给出字
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • C 编程:正向变量参数列表

    我正在尝试编写一个函数 它接受可变数量的参数 如 printf 执行一些操作 然后将变量列表传递给 printf 我不知道如何做到这一点 因为它似乎必须将它们推入堆栈 大约是这样的 http pastie org 694844 http p
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 在 Haskell 中增长数组

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

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法

随机推荐