Почему не оценивается? [Дубликат]

Эти странные цифры появляются из-за того, что компьютеры используют двоичную (базовую 2) систему счисления, а мы используем десятичную (базовую 10).

Есть большинство дробных чисел, которые не могут быть точно представлены в двоичном или десятичном или в обоих. Результат - округленное (но точное) число результатов.

12
задан Erik Allik 4 February 2016 в 11:42
поделиться

3 ответа

Haskell - ленивый язык. Он не оценивает результаты, пока они не «нужны».

Теперь, только печать значение заставляет все это «нужно». Другими словами, если вы наберете выражение в GHCi, он попытается распечатать результат, который заставит все это оценивать. Обычно это то, что вы хотите.

Команда sprint (которая является функцией GHCi, а не частью языка Haskell) позволяет вам узнать, сколько из этого значения было оценено на данный момент.

Например:

Prelude> let xs = [1..]
Prelude> :sprint xs
xs = _

Итак, мы только что объявили xs, и в настоящее время он не оценен. Теперь давайте напечатаем первый элемент:

Prelude> head xs
1
Prelude> :sprint xs
xs = 1 : _

Теперь GHCi оценил головку списка, но не более того.

Prelude> take 10 xs
[1,2,3,4,5,6,7,8,9,10]
Prelude> :sprint xs
xs = 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : _

Теперь оцениваются первые 10 элементов, но больше остается. (Так как xs является бесконечным списком , это неудивительно.)

Вы можете построить другие выражения и оценить их понемногу, чтобы посмотреть, что происходит. Это действительно часть отладчика GHCi, который позволяет вам проходить свой код по одному бит за раз. Особенно, если ваш код попадает в бесконечный цикл, вы не хотите, чтобы print ничего, потому что это может заблокировать GHCi. Но вы все еще хотите посмотреть, что происходит ... следовательно sprint, что позволяет вам видеть, что оценивалось до сих пор.

11
ответ дан MathematicalOrchid 27 August 2018 в 07:31
поделиться

Я немного опоздал, но у меня была аналогичная проблема:

λ: let xs = [1,2,3]
xs :: Num t => [t]
λ: :sprint xs
xs = _
λ: print xs
λ: :sprint xs
xs = _

Эта проблема специфична для полиморфных значений. Если у вас есть -XNoMonomorphismRestriction включен ghci никогда не будет действительно оценивать / усиливать xs, он будет оценивать только / специализации:

λ: :set -XMonomorphismRestriction
λ: let xs = [1,2,3]
xs :: [Integer]
λ: print xs
λ: :sprint xs
xs = [1,2,3]
4
ответ дан Nicolas Mattia 27 August 2018 в 07:31
поделиться

Haskell ленив. Он не оценивает вещи до тех пор, пока они не понадобятся.

Команда GHCi sprint (а не часть Haskell, только команда отладки интерпретатора) печатает значение выражения без принудительной оценки.

Когда вы пишете

let a = 3

, вы связываете новое имя a с правым выражением, но Haskell пока не оценит эту вещь. Поэтому, когда вы sprint, оно печатает _ как значение, указывающее, что выражение еще не было оценено.

Попробуйте следующее:

let a = 3
:sprint a -- a has not been evaluated yet
print a -- forces evaluation of a
:sprint a -- now a has been evaluated
6
ответ дан Sebastian Redl 27 August 2018 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: