问题标签 [polyvariadic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1757 浏览

haskell - Haskell 中的多变量函数

在阅读了这篇关于在 Haskell 中编写多变量函数的文章后,我尝试自己编写一些。

起初我想我会尝试概括它 - 所以我可以有一个函数,通过折叠给定的参数来返回可变参数函数。

但是,编译器不喜欢这样:

但是,如果我返回并为最终结果添加了一个包装器类型,它会起作用:

进行此更改后,它编译得很好,我可以collapseghci.

我不确定为什么最终结果需要包装器类型。如果有人能解释这一点,我将不胜感激。我可以看到编译器告诉我这是功能依赖项的一些问题,但我还没有真正理解正确使用fundeps。

后来,我尝试采取不同的策略,并尝试为接受列表并返回值的函数定义一个可变参数函数生成器。我必须做同样的容器技巧,并且还允许UndecidableInstances.

不允许UndecidableInstances编译器抱怨我的实例声明是非法的:

但是,一旦编译完成,我就可以在 ghci 中成功使用它:

我想我正在寻找的是解释为什么最终值的容器类型是必要的,以及为什么所有各种功能依赖都是必要的

此外,这似乎很奇怪:

我猜这是 allow 的后果UndecidableInstances,但我不知道,我想更好地了解发生了什么。

0 投票
5 回答
12708 浏览

haskell - 如何创建多变量haskell函数?

我需要一个函数,它接受任意数量的参数(所有相同类型),对它们做一些事情,然后返回结果。在我的具体情况下,论点列表是不切实际的。

当我查看 haskell 库时,我看到该函数printf(来自 module Text.Printf)使用了类似的技巧。不幸的是,我无法通过查看源代码来理解这种魔力。

有人可以解释如何实现这一点,或者至少是一些网页/论文/我可以在哪里找到一个很好的描述吗?

动机:

我需要这个的原因真的很简单。对于学校(计算机科学课),我们需要编写一个能够“记录”数学表达式的模块,将其表示为字符串(通过为自己的数据类型编写 Num/Real/etc 的实例),并执行对其进行各种操作。

此数据类型包含一个变量的特殊构造函数,它可以被一个值或任何指定函数替换。目标之一是编写一个函数,该函数接受这样一个带有一些变量(类型对(Char,Rational))的表达式并计算表达式的结果。我们应该看看如何最好地表达函数的目标。(我的想法:该函数返回另一个函数,该函数采用与函数中定义的变量完全相同的参数 - 似乎是不可能的)。

0 投票
1 回答
1323 浏览

haskell - 帮助声明可变数量的参数

高人,

我必须为可以有多个节点的树定义多态数据类型。每个节点可以有任意数量的子节点和一个值。这种类型总是至少有一个节点。我是 Haskell 的新手,所以我问如何声明节点具有可变数量的参数。

这就是我现在所拥有的。这是一棵树,它可以有一个节点或一个具有值 (a) 的节点和两个子树。而不是两个树孩子,我希望他们成为任意数量的树孩子。(类比为 java 可变参数个数“arg ...”)

谢谢你的帮助

编辑

一个小问题::: 我如何在函数参数(标题/签名)中使用可变参数声明这个节点。我必须实现一个名为
“contains”的函数,它将检查节点是否包含特定元素。

第二行正确吗?

0 投票
1 回答
647 浏览

haskell - 如何在 Haskell 中定义一个任意的 arity 函数,其中包括 0 的 arity?

我目前定义任意数量的函数的方法如下,A 是累加器,E 是输入参数类型,R 是结果类型。

但是 foo 的最小数量是 1。 foo 的最小值仍然是 A -> E -> R,而 doFoo 是 E -> R。我也想要 doFoo :: R。如何?

0 投票
4 回答
756 浏览

haskell - 带 IO 的 Haskell 多变量函数

是否有可能有一个函数接受外部函数调用,其中一些外部函数的参数是 CString 并返回一个接受 String 的函数?

这是我正在寻找的示例:

我想出了如何使用 C 数字类型来做到这一点。但是,我想不出一种可以允许字符串转换的方法。

这个问题似乎适合 IO 函数,因为所有转换为 CString 的东西,例如 newCString 或 withCString 都是 IO。

这是处理转换双打的代码的样子。

0 投票
1 回答
226 浏览

haskell - Haskell中的可变参数绑定

下面的代码尝试编写一个可变参数函数,其行为如下:

  • bind_variadic mx f = mx >>= f
  • bind_variadic mx my f = do { x <- mx; y <- my; f x y }

如果将“绑定的其余部分”表示为变量k,我可以编写它,但是为了编写类型类,我需要根据另一个函数编写一个函数。准确地说,我想用l1l0等来l2表达。l1

也许解决方案涉及另一个延续?

编辑

这是一个需要额外加入的想法......

0 投票
1 回答
15460 浏览

haskell - Haskell printf 是如何工作的?

Haskell 的类型安全性在依赖类型语言中是首屈一指的。但是Text.Printf有一些深奥的魔力,看起来很奇怪。

这背后的深层魔力是什么?函数如何Text.Printf.printf接受这样的可变参数?

在 Haskell 中允许可变参数的一般技术是什么,它是如何工作的?

(旁注:使用这​​种技术时,某些类型的安全性显然会丢失。)

0 投票
4 回答
980 浏览

c# - 在 C# 类型约束中指定“任何子类”而不是“一个特定的子类”

如果我想编写一个采用可变数量“TDerived”的方法,其中 TDerived 是“Base”类的任何子类,有什么办法可以做到这一点?

以下代码仅适用于单个特定的指定子类:

即如果我有

那我不能做

因为我得到“最佳重载匹配......有一些无效参数”。

不管编译器如何处理类型约束和可变参数函数,这似乎(据我所知)完全是类型安全的。我知道我可以投射,但如果这是类型安全的,为什么不允许它呢?

编辑:

也许是一个更有说服力的例子:

0 投票
3 回答
10742 浏览

haskell - Haskell“申请”?

可能重复:
为什么在haskell中不允许这样的函数定义?

我是从 Lisp 迁移过来的 Haskell 世界的新手。我正在努力适应 Haskell 完全不同的世界观,而我发现许多新的和令人兴奋的事情之一就是类型系统。作为一个 Lisper,我想我会尝试在 Haskell 中实现一个在 Lisp 世界中非常重要的功能:apply. 对于那些不知道的人,apply 接受一个函数和一个参数列表,并在这些参数上调用函数。在 Scheme 中,(apply + '(1 2 3))与调用 相同(+ 1 2 3),返回 6。

我的 Haskell 代码如下所示:

但是 Haskell 抱怨说:

我想我明白为什么。Apply 的类型需要根据给出的列表的长度而有所不同。给定一个包含 3 个项目的列表,apply 的类型需要是: (a -> a -> a -> b) -> [a] -> b,但是给定一个包含 6 个项目的列表,apply 的类型需要是: (a -> a -> a -> a -> a -> a -> b) -> [a] -> b

我尝试了这个可怕的解决方法:

这行得通,但它几乎不能算作一个apply函数,因为我不能传递apply一个普通的函数,我必须使用一个专门编写的函数来使用我的(尴尬的)FnOrDat 抽象。如果我想编写一个添加四个数字的函数,我需要编写

嗯。

那么 - 我是否遗漏了什么,或者要求一个通用的,apply基本上就像要求一个可以操作任意长度元组的函数?在 Haskell 的静态类型世界观中是否apply有意义?

0 投票
1 回答
320 浏览

haskell - Text.Printf.printf 的函数组合

我想定义一个记录器函数,比如

这很好。现在我想用 格式化提供的字符串printf,像这样

伟大的!由于我经常使用这种模式,因此我想将其printf纳入记录器功能:

不幸的是,这失败了

GHC 推断myPrintf :: String -> IO (),所以显然有问题。我发现了有关Polyvariadic composition的一些信息,但我无法将其应用于我的问题。我什至不确定它是否能解决我的问题。

该代码也可通过gist获得。