Я довольно новичок в языке программирования Scala и пытался что-то прогнать, когда я следил за лекциями в here.Понимание метода вызова вызова и consix метода (: :) в Scala
Я думаю, что я не мог понять, как работает оператор минусы, вот некоторые вещи, которые я пытался:
я создал генератор псевдослучайных чисел, а затем попытался создать список одной случайной величины:
scala> val gen = new java.util.Random
gen: java.util.Random = [email protected]
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Но он попытался передать List (3) следующему методу. Когда я использовал paratheses, не было никаких проблем
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
мне было интересно о порядке исполнения, поэтому я создал функцию, чтобы проверить его
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Как видно из результатов, порядок выполнения такой же, как порядок появления. Тогда я думал, что это может быть о функции «nextInt», то я попробовал следующее:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
Это первый выполняется сложение, и после этого минусов выполняется. Итак, вот вопрос: в чем разница между gen nextInt 3 :: Nil
и 1 + 2 :: Nil
?
Спасибо за ваш подробный ответ, он дал мне много подсказок о многих других вещах. Но у меня есть еще один вопрос: Как компилятор интерпретирует выражение в третьем разделе кода, которое я дал в моем первоначальном вопросе; с точки зрения скобок? потому что использование функции pr показало, что условия выполняются в порядке слева направо. – ciuncan
Правильно, вызовы функций оцениваются слева направо. Это потому, что 'pr (X)' - это выражения аргументов '::', и они сначала оцениваются по порядку появления, а затем передаются значение этому методу. 'pr (1) :: pr (2) :: pr (3) :: Nil' prints 1 2 3. Но' Nil.::(pr(3)).::(pr(2)). : :(pr (1)) 'prints 3 2 1. Но оба возвращают' List (1, 2, 3) ' –
@ciuncan Я не знаю. Возможно, что нотация оператора с правильной фиксацией позволяет оценить порядок оценки с помощью точечной нотации, или может быть, что компилятор оптимизирует '::' вызовы, но имеет ошибку в отношении порядка оценки. –