问题标签 [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.
scala - Scala偏函数组合性能
定义为的偏函数的性能是否有任何差异
一个定义如下?
function - 如何编写永远不会有无效值的 Haskell 部分函数?
假设想要一个函数,获取一个数字列表,它返回相邻数字对的总和,除了两条边,它只返回边号。例如:
我想出了以下功能:
(没关系是否有更好的方法来做到这一点......)
p2
只被p1
. p2
也永远不会用空列表调用,只有列表至少有一个元素。但是,p2
它仍然是一个部分功能,它会触发一个非详尽的模式匹配警告ghc -Wall
。
处理这个问题的公认方法是什么?我只是不写p2 []
案例吗?或者p2 [] = undefined
,或者p2 [] = unused_value
,或者别的什么?
scala - 当 `unapply` 函数返回 Boolean 而不是 Option 时,提取器如何工作?
我从楼梯书上了解了提取器:
这很简单。但是今天我从一些关于 Play 框架的书中读到了这段代码:
当unapply
函数返回 Boolean 而不是 Option 时,提取器如何工作?在这里工作怎么&
样Accepts.Xml
?
idris - Idris:函数使用 Nat 参数,但使用 Integer 参数的类型检查失败
我是伊德里斯的新手。我正在尝试类型,我的任务是制作一个“洋葱”:一个接受两个参数的函数:一个数字和任何东西,并将任何东西放入List
嵌套的次数中。
例如,结果mkOnion 3 "Hello World"
应该是[[["Hello World"]]]
。我做了这样的功能,这是我的代码:
计划工作的结果:
这正是我所需要的。但是当我这样做时,但是像这样将 Nat 更改为 Integer
我收到一个错误:
为什么类型检查会失败?
我认为这是因为Integer
可以采用负值并且Type
在负值的情况下无法计算。如果我是对的,编译器如何理解这一点?
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]
. 传入的值实际上是相同的。为什么一个案例有效,而另一个案例无效?
scala - 组合部分函数
我来自 Java,想结合两个部分函数,如下所示:
我想写这样的东西:
但它拒绝编译。有没有办法简洁地修复它?
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 }"
, 也与cq
和pq
quasiquotes - 在不同的地方添加
c.typecheck
orc.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(没有“宏天堂”)。
scala - 模式匹配:使用 PartialFunction 拆分代码?
我正在努力实现“简单”的行为:将模式匹配代码分成两个单独的函数。
为了清晰起见,我正在简化模型:
我想在不同的函数上对这些进行模式匹配(因为实际代码很长),但是还有其他参数,所以 PartialFunctions 让我感到恶心......
在一个完美的世界里,我可以写:
然而,这是行不通的。主要是因为我的函数中需要几个参数。“为什么你不使用元组?” 你可以说?好吧,我试过了,编译器不会停止抱怨预期类型与实际类型不同,并且与我的别名不同:(
任何帮助、提示或替代方法都会很有用!
干杯
编辑:我遵循了 Cyrille 的回答,但我还需要在比赛前进行一些工作,如下所示:
haskell - 如何使用 ghc 7.10.3 在除以零时生成堆栈跟踪?
如果程序运行并崩溃并显示“除以零”消息,那么识别代码中此错误在何处生成的最佳方法是什么?