问题标签 [partial-functions]

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 投票
1 回答
423 浏览

scala - Scala偏函数组合性能

定义为的偏函数的性能是否有任何差异

一个定义如下?

0 投票
2 回答
91 浏览

function - 如何编写永远不会有无效值的 Haskell 部分函数?

假设想要一个函数,获取一个数字列表,它返回相邻数字对的总和,除了两条边,它只返回边号。例如:

我想出了以下功能:

(没关系是否有更好的方法来做到这一点......)

p2只被p1. p2也永远不会用空列表调用,只有列表至少有一个元素。但是,p2它仍然是一个部分功能,它会触发一个非详尽的模式匹配警告ghc -Wall

处理这个问题的公认方法是什么?我只是不写p2 []案例吗?或者p2 [] = undefined,或者p2 [] = unused_value,或者别的什么?

0 投票
2 回答
217 浏览

scala - 当 `unapply` 函数返回 Boolean 而不是 Option 时,提取器如何工作?

我从楼梯书上了解了提取器:

这很简单。但是今天我从一些关于 Play 框架的书中读到了这段代码:

unapply函数返回 Boolean 而不是 Option 时,提取器如何工作?在这里工作怎么&Accepts.Xml

0 投票
1 回答
317 浏览

idris - Idris:函数使用 Nat 参数,但使用 Integer 参数的类型检查失败

我是伊德里斯的新手。我正在尝试类型,我的任务是制作一个“洋葱”:一个接受两个参数的函数:一个数字和任何东西,并将任何东西放入List嵌套的次数中。

例如,结果mkOnion 3 "Hello World"应该是[[["Hello World"]]]。我做了这样的功能,这是我的代码:

计划工作的结果:

这正是我所需要的。但是当我这样做时,但是像这样将 Nat 更改为 Integer

我收到一个错误:

为什么类型检查会失败?

我认为这是因为Integer可以采用负值并且Type在负值的情况下无法计算。如果我是对的,编译器如何理解这一点?

0 投票
3 回答
652 浏览

scala - 匿名 PartialFunction 语法

我之前问过这个问题:将 PartialFunction 与常规函数结合起来

然后意识到,我实际上并没有问对。所以,这里又进行了一次尝试。

如果我这样做:

它不编译:error: missing parameter type for expanded function The argument types of an anonymous function must be fully known. (SLS 8.5) Expected type was: PartialFunction[?,?]

但这很好用:

问题是有什么区别?在这两种情况下,参数的类型是相同的:PartialFunction[Int, String]. 传入的值实际上是相同的。为什么一个案例有效,而另一个案例无效?

0 投票
2 回答
296 浏览

scala - 组合部分函数

我来自 Java,想结合两个部分函数,​​如下所示:

我想写这样的东西:

但它拒绝编译。有没有办法简洁地修复它?

0 投票
1 回答
477 浏览

scala - 如何使用 Scala 宏来创建新的部分函数或转换它们?

我在编写转换给定部分函数并创建新部分函数的宏时遇到问题。例如,我希望能够将给定的部分函数分解为其元素——模式绑定器、保护条件和主体;然后我想将模式绑定器和保护条件分解成更小的部分,并从这些部分中重新组装新的部分功能。但是,我在无法调试的宏扩展中遇到奇怪的错误。

给出相同错误的最简单问题是将给定的部分函数分解为 binder、guard 和 body,并将其重新组合成相同的部分函数的代码。

我可以使用简单类型来做到这一点,PartialFunction[Int,Any]但不能使用涉及案例类的类型,PartialFunction[MyCaseClass,Any].

这是有效的代码和无效的代码。

工作代码:获取一个部分函数,​​使用准引号对其进行解构,再次组装相同的函数,然后返回它。

此宏编译并测试通过:

非工作代码:完全相同的宏,除了使用案例类而不是Int作为部分函数的参数。

代码完全相同,只是类型不同(Complicated而不是Simple)。

宏代码编译,但测试编译失败(宏扩展失败):

我已将问题简化为仍然失败的最低限度。在我的实际代码中,类型更复杂,部分函数可能有保护,我确实通过重新排列它的参数和保护来转换部分函数的代码。我有时可以在没有守卫的情况下进行转换,但当偏函数的参数是案例类时则不行。也许守卫的存在并不是问题的根源:当unapply某处存在复合类型时,问题就会发生。我得到的错误消息与上面显示的这个大大简化的示例基本相同。

尽管尝试了许多转换部分函数的替代方法,但我似乎无法解决这个问题:

  • 使用白盒宏上下文
  • 使用普通的准引号,如上例所示
  • 对 case和patterns 使用特殊的 quasiquotes cq"...",如 quasiquotes 的文档中所示pq"..."q"{case ..$cases}"
  • 与警卫匹配:q"{case $binder if $guard => $body }", 也与cqpqquasiquotes
  • 在不同的地方添加c.typecheckor c.untypecheck(这曾经被称为resetAllAttrs,现在已弃用)
  • 不使用准引号,但在原始语法树中执行所有操作:Traverser与原始树匹配一起使用,例如case UnApply(Apply(Select(t@Ident(TermName(_)), TermName("unapply")), List(Ident(TermName("<unapply-selector>")))), List(binder)) if t.tpe <:< typeOf[Blob]等等
  • 尝试将Ident模式匹配器中的Ident' 替换为来自保护条件的 ',反之亦然(这会产生奇怪的错误,“断言失败”,由于类型检查失败)
  • 使用Any而不是特定类型,返回PartialFunction[Any,Any]或总函数Function1[Blob,Any]
  • 使用类型参数T而不是Blob,参数化宏并接受PartialFunction[T,Any]

我将不胜感激任何帮助!我正在使用带有直接宏的 Scala 2.11.8(没有“宏天堂”)。

0 投票
1 回答
1821 浏览

scala - 模式匹配:使用 PartialFunction 拆分代码?

我正在努力实现“简单”的行为:将模式匹配代码分成两个单独的函数。

为了清晰起见,我正在简化模型:

我想在不同的函数上对这些进行模式匹配(因为实际代码很长),但是还有其他参数,所以 PartialFunctions 让我感到恶心......
在一个完美的世界里,我可以写:

然而,这是行不通的。主要是因为我的函数中需要几个参数。“为什么你不使用元组?” 你可以说?好吧,我试过了,编译器不会停止抱怨预期类型与实际类型不同,并且与我的别名不同:(

任何帮助、提示或替代方法都会很有用!
干杯


编辑:我遵循了 Cyrille 的回答,但我还需要在比赛前进行一些工作,如下所示:

0 投票
1 回答
122 浏览

recursion - 为什么这个函数会挂起 REPL?

使用 Idris 进行测试驱动开发的第 9 章介绍了以下数据类型和removeElem功能。

以下作品:

但是,几分钟后以下调用仍在运行:

我猜为什么编译这么慢?

0 投票
1 回答
398 浏览

haskell - 如何使用 ghc 7.10.3 在除以零时生成堆栈跟踪?

如果程序运行并崩溃并显示“除以零”消息,那么识别代码中此错误在何处生成的最佳方法是什么?