我List.fold()在 Dart 2.1.0 中尝试:
void main() {
final a = [1,2,3];
print(a.fold(0, (x,y) => x + y));
}
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:
错误:未为类“dart.core::Object”定义方法“+”。
尝试将名称更正为现有方法的名称,或定义名为“+”的方法。
似乎无法推断出xto的类型int,所以不知道如何在+那里应用。
根据方法规范,x应该与初始值具有相同的类型0,这显然是一个int. 为什么 Dart 不能推断出这一点?
我可以通过显式提示类型使其工作:
void main() {
final a = [1,2,3];
print(a.fold<int>(0, (x,y) => x + y));
}
Run Code Online (Sandbox Code Playgroud)
但是我有点失望,因为 Dart 无法为我推断出这一点。在大多数其他情况下,它的类型推断似乎更强。
在Kotlin中,我想仅在另一个变量不为null时才进行赋值(否则,不执行操作).我可以想到两种简洁的方法:
fun main(args: Array<String>) {
var x: Int? = null
var n = 0
// ... do something ...
x?.let { n = it } // method 1
n = x ?: n // method 2
}
Run Code Online (Sandbox Code Playgroud)
然而,考虑到我必须做的频率,他们并不觉得足够简洁.第一种方法似乎有点矫枉过正.第二种方法是唠叨要求后面的表达式?:.
我怀疑必须有更好的方法,比如n =? x什么?还是n = x??在那儿?
我正在使用Dart 2.1.0在Flutter中进行编程,遇到这种情况:
mixin Salt {
final int pinches; // Immutable, and I want to delay initialization.
// Cannot declare constructors for mixin
}
class Meat with Salt {
Meat(int pinches) ... // How to initialize it?
}
Run Code Online (Sandbox Code Playgroud)
Salt没有构造函数,所以我不能使用初始化列表。pinches是final,因此无法在Meat的构造函数中进行设置。
我不想Salt上课,因为Meat可能需要扩展其他内容。
我想保持pinches不变。
有办法吗?提前致谢。
我在 Dart 2.1.0 中编程,尝试通过监听自定义流来更新一些状态:
import 'dart:async';
void main() {
final controller = StreamController<int>();
final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);
var seen2x = false;
divisibleBy2.listen((y) {
seen2x = y;
});
controller.add(2);
print(seen2x);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它会打印false. 显然,该print函数比侦听器函数更早被调用。状态没有及时更新。
通过await-ing on controller.add(2),我可以直接得到订单:
import 'dart:async';
void main() async {
final controller = StreamController<int>();
final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);
var seen2x = false;
divisibleBy2.listen((y) {
seen2x = y;
});
await controller.add(2); …Run Code Online (Sandbox Code Playgroud) 我正在阅读"Haskell编程"一书.一个练习要求我map f使用高阶函数进行定义.我选择定义map (+1)如下:
unfold p h t x | p x = []
| otherwise = h x : unfold p h t (t x)
-- equivalent to `map (+1)`
mapinc = unfold (==[]) ((+1).head) tail
Run Code Online (Sandbox Code Playgroud)
(直接从练习题中获取)unfold p h t如果谓词p对参数值为true,则函数生成空列表,否则通过将函数h应用于此值以给出头部而t生成非空列表,并生成另一个函数以生成另一个以相同的方式递归处理的参数,以生成列表的尾部.
我检查了我的实现,mapinc它看起来很好:
*Main> mapinc [1,2,3]
[2,3,4]
Run Code Online (Sandbox Code Playgroud)
但是,在我添加类型声明后:
mapinc :: Num a => [a] -> [a]
mapinc = unfold (==[]) ((+1).head) tail
Run Code Online (Sandbox Code Playgroud)
然后在WinGHCi中重新加载脚本,它会出现以下错误:
• Could not deduce (Eq …Run Code Online (Sandbox Code Playgroud) 我正在使用 Kotlin 来解析 JSON。例如,我有一个国家的表示:{"code":"US", "name":"United States of America"}。Country为了从这样的 a生成一个对象JSONObject,我有这个函数:
val produceCountry = fun (js: JSONObject) =
Country(js.getString("code"), js.getString("name"))
Run Code Online (Sandbox Code Playgroud)
我可以使用这个函数轻松解析数组Country。然而,除了 数组之外Country,我还有Cat、Car、Cart、CordlessPhone等数组。每个数组都有自己的produce*函数,将 a 转换JSONObject为该类型的 Kotlin 对象。为了概括数组解析,我有这个函数:
fun <T> produceSetOf(array: JSONArray, element: (JSONObject) -> T): Set<T> {
val set = mutableSetOf<T>()
for (i in 0 until array.length())
set.add(element(array.getJSONObject(i)))
return set
}
Run Code Online (Sandbox Code Playgroud)
所以我可以调用produceSetOf(jsonArray, produceCountry)遇到一个元素类型为 的数组Country。这也适用于Cat, Car …
我正在panic/recoverGolang 中测试。这个简单的程序按预期工作:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer printRecover()
panic("OMG!")
}
Run Code Online (Sandbox Code Playgroud)
输出:
Recovered: OMG!
Run Code Online (Sandbox Code Playgroud)
但是,如果我将该函数包装printRecover()在一个更大的延迟函数中:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer func() {
printRecover()
}()
panic("OMG!")
}
Run Code Online (Sandbox Code Playgroud)
它不会恢复并让恐慌持续下去:
Recovered: <nil>
panic: OMG!
goroutine 1 [running]:
main.main()
/tmp/sandbox898315096/main.go:15 +0x60
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下区别吗?
我正在《Elm 指南》中阅读有关优化的内容。它讨论了键控节点,以美国总统为例:
import Html exposing (..)
import Html.Keyed as Keyed
import Html.Lazy exposing (lazy)
viewPresidents : List President -> Html msg
viewPresidents presidents =
Keyed.node "ul" [] (List.map viewKeyedPresident presidents)
viewKeyedPresident : President -> (String, Html msg)
viewKeyedPresident president =
( president.name, lazy viewPresident president )
viewPresident : President -> Html msg
viewPresident president =
li [] [ ... ]
Run Code Online (Sandbox Code Playgroud)
然后给出这个作为解释:
现在,虚拟 DOM 实现可以识别何时重新排列列表。它首先通过密钥匹配所有总统。然后它区分这些。我们对每个条目都使用了惰性,因此我们可以跳过所有这些工作。好的!然后它会弄清楚如何打乱 DOM 节点以按照您想要的顺序显示内容。所以键控版本最终要做的工作要少得多。
我的困惑是:如果我不在lazy键控节点内部使用,虚拟 DOM 仍然必须比较列表中的每个条目,即使它可以匹配某些键。看来键控节点的有用性确实取决于lazy内部。我的理解正确吗?