问题标签 [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 投票
2 回答
435 浏览

haskell - 在 Haskell 中,我如何获取一个 m 元谓词和一个 n 元谓词并构造一个 (m+n) 元谓词?

今天,我尝试使用类型类来归纳构造任意数量的谓词的函数,将任意类型的任意组合作为输入,返回相同类型但应用了一些基本操作的其他谓词。例如

将返回一个谓词,该谓词对于大于 2 的偶数计算为真,并且

会返回=

一切都很好,让这部分工作,但它提出了一个问题,如果我想将两个谓词的连接定义为一个谓词,每个连接谓词的每个输入都需要一个输入,该怎么办?例如:

将返回 Ord a => a -> a -> Bool -> Bool。这可以做到吗?如果是这样,怎么做?

0 投票
2 回答
708 浏览

go - Go 中的可变参数泛型参数

假设我想在 Go 中为 Slices制作等效的JavaScript函数。Array.splice我有以下代码:

此示例将有效,但仅适用于 type 的参数int。我想让它成为通用的,并且我知道我应该给可变参数elements提供 type interface{},但是如何从函数内部创建一个具有该接口类型的新切片?

换句话说,如何根据函数第一行中的参数类型动态指定切片的类型,在哪里newslice创建?

0 投票
3 回答
2642 浏览

c++ - 具有可变函数参数的 C++ 多态性

我正在与您分享一个使用可变参数函数参数的类所遇到的问题。它是下面代码中显示的类 Thread。它是 std::thread 的包装器,以便使用函数模式。

我想在这个函数中使用多态性将类 Thread 继承到一个新类 Functor 中,但是 gcc 返回以下错误:

我真的不明白这个错误,因为纯虚函数在派生类中定义得很好。但是,将函数 run() 移动到派生类 (Functor) 中,它可以工作。

在此先感谢, Caner

0 投票
1 回答
293 浏览

haskell - 多元广义和

这个答案演示了一个对其参数求和的多变量函数:

我为以下所有成员创建了此函数的通用版本Num

但是,这只适用于像mySum (1::Int) (3::Int) (2::Int) :: Int. 如果没有参数上的类型说明符,我会收到此错误:

没有因使用“mySum”而产生 (MySumType n0 Float) 的实例

可能的修复:为 (MySumType n0 Float) 添加一个实例声明

在表达式中:mySum 1.0 :: Float

在 `it' 的等式中:it = mySum 1.0 :: Float

是什么导致了这个问题,我该如何解决?我怀疑这与整数文字的类型有关Num a => a。还有与上述不依赖扩展的等效功能吗?上面使用的是多参数类型类和灵活实例。

0 投票
1 回答
166 浏览

haskell - 为什么这个多变量函数需要类型注释?

这是一个简单的多变量函数,以 为模型Text.Printf.printf

它在没有任何类型注释的 ghci 中工作正常:

但是,当我删除SumArg a约束时……</p>

…它失败:

怎么来的?

(老实说,我对第一个版本的参数不需要类型注释这一事实感到更加困惑

0 投票
0 回答
189 浏览

function - 多变量咖喱定义中的不明确类型变量

所以,我正在尝试实现一个多变量 ZipWithN,如此处所述。不幸的是,Paczesiowa 的代码似乎是用过时版本的 ghc 和 HList 编译的,所以在试图理解它是如何工作的过程中,我也一直在将它移植到这两个版本的最新版本(ghc- 7.8.3 和 HList-0.3.4.1)。这很有趣。

无论如何,我在中间函数的定义中遇到了一个谷歌没有帮助我修复的错误curryN'。从概念上讲,curryN'很简单:它接受一个类型级别的自然数N(或者,严格来说,该类型的值)和一个函数f,其第一个参数是一个长度为 HList 的函数N,并返回一个N-ary 函数,该函数接受一个 HList出它的第一个N参数,并返回f应用于该 HList。是curry,但是是多变量的。

它使用三个辅助函数/类:

第一个是ResultType/ resultType,正如我在这里定义的那样。 resultType将单个函数作为参数,并在将其应用于尽可能多的参数后返回该函数的类型。(严格来说,它再次返回该类型的未定义值)。

例如:

(后一种情况是因为如果a碰巧是 type 的函数x -> y, resultType 必须返回y。所以它并不完美地应用于多态函数。)

后两个是Eat/eatMComp/ ,像这样mcomp一起定义(连同curryN')在单个文件(连同损坏的curryN')中。

eat的第一个参数是一个类型为自然数的值N,并返回一个函数,该函数接受N参数并将它们组合成一个 HList:

据我所知,它完美无缺。 mcomp是一个多变量组合函数。它需要两个函数,f并且g,其中f需要一些参数N。它返回一个接受N参数的函数,应用于f所有参数,然后g应用于f. (函数顺序平行(>>>)多于(.)

就像resultType,它在返回类型是类型变量的函数上“中断”,但由于我只打算在eat(其最终返回类型只是一个HList)上使用它,它应该可以工作(至少 Paczesiowa 似乎是这么认为的)。它确实如此,如果第一个参数eat是固定的:

工作正常。

curryN'但是,定义如下:

但是,尝试将其加载到 ghci 中会出现以下错误:

很清楚eatmcomp不要像我希望的那样玩得那么好。顺便说一句,这与给出的那种错误有很大不同mcomp (+) (+1),后者抱怨MComp.

无论如何,尝试查找有关此错误的信息并没有让我找到任何有用的信息 - 我自己调试的最大障碍是我什至不知道类型变量f0是什么,因为它没有出现在任何类型中ghci 推断的签名或上下文。

我最好的猜测是,mcomp通过 's 的多态返回类型进行递归时遇到了麻烦eat(即使它是由类型级自然数固定的)。但如果是这样的话,我不知道我将如何解决它。

另外(对我来说很奇怪),如果我尝试将其合并Part1.hsPart2.hs一个文件中,我仍然会收到一个错误......但是一个不同的

再次使用神秘的f0类型变量。我承认我对所有这些 typehackery 有点不知所措,所以如果有人能帮我弄清楚这里到底是什么问题,更重要的是,我该如何解决它(如果是的话,希望,可能),我将非常感激。

最后说明:这里的两个文件之所以叫Part1和Part3,是因为Part2里面有一些辅助函数用到了zipWithN,而没有curryN'。在大多数情况下,它们工作正常,但我稍后可能会问一些奇怪的问题。

0 投票
1 回答
156 浏览

haskell - Printf 类函数

我正在尝试编写一个具有任意数量参数的函数。这些参数可以是 Int 或 String。我对整数有疑问。出于某种原因(我不明白),值 1 成为歧义的来源。如何处理这个错误,它的根源是什么?

在上述情况下,我遇到了错误

编辑

感谢 user5402 指出了 ghci 和 ghc 之间的区别。Ghci默认启用扩展 ExtendedDefaultRules

因此,加上三行,我的示例可以正常工作。

0 投票
2 回答
141 浏览

haskell - 我怎样才能把这个解析器变成一个适用的、多变量的解析器?

我正在尝试解析日期,例如09/10/2015 17:20:52

我有一种预感,某种zipWithN会概括listUncurry。也许某种foldl ($)

作为一个附带问题(出于好​​奇),parsec解析器可以生成使用吗?

0 投票
2 回答
232 浏览

haskell - Haskell,多变量函数和类型推断

在寻找多变量函数示例时,我发现了这个资源: StackOverflow:如何创建多变量 haskell 函数?,并且有一个这样的答案片段:

然后我们可以使用:

出于好奇,我尝试对其进行了一些更改,因为乍一看我发现它非常棘手,因此我进入了这个:

我只是更改IntegerIntinstance (Integral a, SumRes r) => SumRes (a -> r) where减少了多态性instance (SumRes r) => SumRes (Int -> r) where

要编译它,我必须设置XFlexibleInstances标志。当我尝试测试sumOf功能时,我遇到了一个问题:

然后我尝试了:

考虑到我们在类型类中使用,为什么 Haskell 不能Int在这种情况下推断出我们想要一个?IntSumRes

0 投票
1 回答
120 浏览

haskell - 为什么我会发生冲突?

所以我输入了这个

我得到

事情是,但m不能m->a平等!为什么它给我一个冲突?(另外,关于如何制作多变量 mconcat 的任何提示(以printf图书馆的风格)?