小编Nic*_*Lee的帖子

为什么 Dart 不能推断 List.fold() 的类型?

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 无法为我推断出这一点。在大多数其他情况下,它的类型推断似乎更强。

type-inference dart flutter

8
推荐指数
1
解决办法
2003
查看次数

仅当右侧不为空时才更好地分配?

在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??在那儿?

kotlin kotlin-null-safety

7
推荐指数
1
解决办法
276
查看次数

如何在Dart中初始化mixin的不可变数据?

我正在使用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没有构造函数,所以我不能使用初始化列表。pinchesfinal,因此无法在Meat的构造函数中进行设置。

我不想Salt上课,因为Meat可能需要扩展其他内容。

我想保持pinches不变。

有办法吗?提前致谢。

final mixins dart flutter

7
推荐指数
3
解决办法
896
查看次数

在 Dart 中,如何确保在继续之前完成流更新?

我在 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)

asynchronous stream dart flutter

6
推荐指数
1
解决办法
1629
查看次数

类型声明有什么问题吗?

我正在阅读"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)

haskell higher-order-functions

3
推荐指数
1
解决办法
55
查看次数

如何检查 Kotlin 函数内的泛型类型?

我正在使用 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,我还有CatCarCartCordlessPhone等数组。每个数组都有自己的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 …

arrays json higher-order-functions kotlin

3
推荐指数
1
解决办法
4234
查看次数

为什么recover() 在嵌套的延迟函数中不起作用?

我正在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)

有人可以解释一下区别吗?

error-handling go

2
推荐指数
1
解决办法
975
查看次数

Keyed Node 是否适合与 Lazy 一起使用?

我正在《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内部。我的理解正确吗?

elm

1
推荐指数
1
解决办法
204
查看次数