问题标签 [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.
haskell - Haskell 中的多变量函数
在阅读了这篇关于在 Haskell 中编写多变量函数的文章后,我尝试自己编写一些。
起初我想我会尝试概括它 - 所以我可以有一个函数,通过折叠给定的参数来返回可变参数函数。
但是,编译器不喜欢这样:
但是,如果我返回并为最终结果添加了一个包装器类型,它会起作用:
进行此更改后,它编译得很好,我可以collapse
在ghci
.
我不确定为什么最终结果需要包装器类型。如果有人能解释这一点,我将不胜感激。我可以看到编译器告诉我这是功能依赖项的一些问题,但我还没有真正理解正确使用fundeps。
后来,我尝试采取不同的策略,并尝试为接受列表并返回值的函数定义一个可变参数函数生成器。我必须做同样的容器技巧,并且还允许UndecidableInstances
.
不允许UndecidableInstances
编译器抱怨我的实例声明是非法的:
但是,一旦编译完成,我就可以在 ghci 中成功使用它:
我想我正在寻找的是解释为什么最终值的容器类型是必要的,以及为什么所有各种功能依赖都是必要的。
此外,这似乎很奇怪:
我猜这是 allow 的后果UndecidableInstances
,但我不知道,我想更好地了解发生了什么。
haskell - 如何创建多变量haskell函数?
我需要一个函数,它接受任意数量的参数(所有相同类型),对它们做一些事情,然后返回结果。在我的具体情况下,论点列表是不切实际的。
当我查看 haskell 库时,我看到该函数printf
(来自 module Text.Printf
)使用了类似的技巧。不幸的是,我无法通过查看源代码来理解这种魔力。
有人可以解释如何实现这一点,或者至少是一些网页/论文/我可以在哪里找到一个很好的描述吗?
动机:
我需要这个的原因真的很简单。对于学校(计算机科学课),我们需要编写一个能够“记录”数学表达式的模块,将其表示为字符串(通过为自己的数据类型编写 Num/Real/etc 的实例),并执行对其进行各种操作。
此数据类型包含一个变量的特殊构造函数,它可以被一个值或任何指定函数替换。目标之一是编写一个函数,该函数接受这样一个带有一些变量(类型对(Char,Rational)
)的表达式并计算表达式的结果。我们应该看看如何最好地表达函数的目标。(我的想法:该函数返回另一个函数,该函数采用与函数中定义的变量完全相同的参数 - 似乎是不可能的)。
haskell - 帮助声明可变数量的参数
高人,
我必须为可以有多个节点的树定义多态数据类型。每个节点可以有任意数量的子节点和一个值。这种类型总是至少有一个节点。我是 Haskell 的新手,所以我问如何声明节点具有可变数量的参数。
这就是我现在所拥有的。这是一棵树,它可以有一个节点或一个具有值 (a) 的节点和两个子树。而不是两个树孩子,我希望他们成为任意数量的树孩子。(类比为 java 可变参数个数“arg ...”)
谢谢你的帮助
编辑
一个小问题::: 我如何在函数参数(标题/签名)中使用可变参数声明这个节点。我必须实现一个名为
“contains”的函数,它将检查节点是否包含特定元素。
第二行正确吗?
haskell - 如何在 Haskell 中定义一个任意的 arity 函数,其中包括 0 的 arity?
我目前定义任意数量的函数的方法如下,A 是累加器,E 是输入参数类型,R 是结果类型。
但是 foo 的最小数量是 1。 foo 的最小值仍然是 A -> E -> R,而 doFoo 是 E -> R。我也想要 doFoo :: R。如何?
haskell - 带 IO 的 Haskell 多变量函数
是否有可能有一个函数接受外部函数调用,其中一些外部函数的参数是 CString 并返回一个接受 String 的函数?
这是我正在寻找的示例:
我想出了如何使用 C 数字类型来做到这一点。但是,我想不出一种可以允许字符串转换的方法。
这个问题似乎适合 IO 函数,因为所有转换为 CString 的东西,例如 newCString 或 withCString 都是 IO。
这是处理转换双打的代码的样子。
haskell - Haskell中的可变参数绑定
下面的代码尝试编写一个可变参数函数,其行为如下:
bind_variadic mx f = mx >>= f
bind_variadic mx my f = do { x <- mx; y <- my; f x y }
如果将“绑定的其余部分”表示为变量k
,我可以编写它,但是为了编写类型类,我需要根据另一个函数编写一个函数。准确地说,我想用l1
、l0
等来l2
表达。l1
也许解决方案涉及另一个延续?
编辑
这是一个需要额外加入的想法......
haskell - Haskell printf 是如何工作的?
Haskell 的类型安全性在依赖类型语言中是首屈一指的。但是Text.Printf有一些深奥的魔力,看起来很奇怪。
这背后的深层魔力是什么?函数如何Text.Printf.printf
接受这样的可变参数?
在 Haskell 中允许可变参数的一般技术是什么,它是如何工作的?
(旁注:使用这种技术时,某些类型的安全性显然会丢失。)
c# - 在 C# 类型约束中指定“任何子类”而不是“一个特定的子类”
如果我想编写一个采用可变数量“TDerived”的方法,其中 TDerived 是“Base”类的任何子类,有什么办法可以做到这一点?
以下代码仅适用于单个特定的指定子类:
即如果我有
那我不能做
因为我得到“最佳重载匹配......有一些无效参数”。
不管编译器如何处理类型约束和可变参数函数,这似乎(据我所知)完全是类型安全的。我知道我可以投射,但如果这是类型安全的,为什么不允许它呢?
编辑:
也许是一个更有说服力的例子:
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
有意义?
haskell - Text.Printf.printf 的函数组合
我想定义一个记录器函数,比如
这很好。现在我想用 格式化提供的字符串printf
,像这样
伟大的!由于我经常使用这种模式,因此我想将其printf
纳入记录器功能:
不幸的是,这失败了
GHC 推断myPrintf :: String -> IO ()
,所以显然有问题。我发现了有关Polyvariadic composition的一些信息,但我无法将其应用于我的问题。我什至不确定它是否能解决我的问题。
该代码也可通过gist获得。