Описание тега strictness

В семантике Haskell строгость связана с тем, заставляет ли оценка выражения оценивать подвыражение.
2 ответа

Строгая оценка целочисленного аккумулятора

Вот классическая первая попытка на заказ length функция: length1 [] = 0 length1 (x:xs) = 1 + length1 xs А вот хвосто-рекурсивная версия: length2 = length2' 0 where length2' n [] = n length2' n (x:xs) = length2' (n+1) xs Тем не мение, (n+1) не будет …
08 июл '13 в 12:21
1 ответ

Есть ли какая-либо гарантия относительно порядка оценки в соответствии с шаблоном?

Следующие (&&) :: Bool -> Bool -> Bool False && _ = False True && False = False True && True = True имеет желаемое свойство короткого замыкания False && undefined ≡ False, Первый пункт, который не являет…
30 окт '16 в 12:06
3 ответа

Логичность И строгость с монадой IO

Я пытаюсь написать простую программу на Хаскеле. Он должен в основном запускать две команды оболочки параллельно. Вот код: import System.Cmd import System.Exit import Control.Monad exitCodeToBool ExitSuccess = True exitCodeToBool (ExitFailure _) = F…
11 апр '14 в 12:38
2 ответа

Может ли последовательность по infinte Maybes когда-либо прекратить?

Другими словами, можно ли оптимизировать следующее Just [1..]? > sequence (map Just [1..]) *** Exception: stack overflow Существует также более конкретный пример в data61/fp-course где досрочное прекращение ожидается, если Empty значение присутст…
10 янв '18 в 23:15
1 ответ

Отображение строгой или ленивой функции

(head . map f) xs = (f . head) xs Это работает для каждого списка xs, когда f строгое. Кто-нибудь может дать мне пример, почему с нестрогим f это не работает?
29 авг '16 в 01:26
1 ответ

Неопровержимые / ленивые упражнения в хаскельском викибуке

На полпути здесь... https://en.wikibooks.org/wiki/Haskell/Laziness ... это упражнение, спрашивающее о последствиях изменений в альтернативной реализации head функция, которая использует неопровержимые образцы. Это дает определение head' следующим об…
1 ответ

Бесконечная рекурсия при перечислении всех значений универсального экземпляра

Для другого ответа я написал следующий код, предоставляя по диагонали Universe экземпляры для перечислимых Generic s (он немного обновлен по сравнению с версией, но использует ту же логику): {-# LANGUAGE DeriveGeneric, TypeOperators, ScopedTypeVaria…
08 май '14 в 16:22
4 ответа

Не нарушает ли существование rseq/seq ссылочную прозрачность? Есть ли альтернативные подходы, которые этого не делают?

Я всегда думал, что заменить выражение x :: () с () :: () будет одной из самых основных оптимизаций при компиляции программ на Haskell. поскольку () имеет одного жителя, независимо от того, что x есть результат (), Эта оптимизация показалась мне зна…
02 дек '12 в 19:48
1 ответ

Где могут появиться BangPatterns

Из руководства пользователя GHC кажется, что большинство Pat может быть PBangPat, но есть несколько исключений. например, челки верхнего уровня в модуле (например, !main) не допускаются и x : !xs не может разобрать x : (!xs) parses спасибо @chi. Как…
03 авг '15 в 14:46
2 ответа

Это оценка или $! достаточно, чтобы WHNF-форсировал значение в многопоточном монадном контексте, или мне нужен pseq?

Кажется, работает следующее (как в: он продолжает говорить Surely tomorrow каждую секунду) import Control.Concurrent import Control.Concurrent.MVar import Control.Exception (evaluate) main :: IO () main = do godot <- newEmptyMVar forkIO $ do g &l…
1 ответ

Ошибка GHC для пропущенных строгих полей

Я читаю эту статью. Это читает: При построении значения с синтаксисом записи GHC выдаст вам ошибку, если вы забудете строгое поле. Это только даст вам предупреждение для нестрогих полей. Кто-нибудь может дать мне конкретный пример этого?
08 апр '18 в 06:25
1 ответ

Пропустив что-то со строгостью

У меня есть этот код: divisors n = 1:[y|y<-[2..(n `div` 2)], n `mod` y == 0] writeList l = do print "Start" print l Затем я хочу вызвать функцию со строгим аргументом; Я старался: writeList $! (divisors 12345678) а также (divisors 12345678) \`seq…
12 сен '12 в 20:01
2 ответа

Монада IO предотвращает короткое замыкание встроенной карты M?

Несколько озадачен следующим кодом. В не-игрушечной версии задачи я пытаюсь выполнить монадическое вычисление в монаде Result, значения которого могут быть построены только из IO. Похоже, магия за IO делает такие вычисления строгими, но я не могу по…
2 ответа

Работа с бесконечными списками со строгими монадами

У меня есть функция f :: [a] -> b который работает с бесконечными списками (например, take 5, takeWhile (< 100) . scanl (+) 0 и так далее). Я хочу передать этой функции значения, сгенерированные строгими монадическими действиями (например, ran…
3 ответа

Введите принудительное "строгое / непереносимое" подмножество / версию Haskell

Мне очень нравится Haskell, однако одна из главных вещей, которые касаются меня в Haskell, заключается в сложности рассуждений об использовании пространства. По сути, возможность использования thunks и рекурсии создает некоторые хитрые ситуации, ког…
19 апр '13 в 03:59
1 ответ

Пример снижения производительности из-за использования строгих конструкторов данных

Я читаю о строгих конструкторах данных. В связанной вики статье говорится, что "Аннотации строгости могут ухудшить производительность [потому что] аннотация строгости вынуждает компилятор обеспечить полную оценку поля перед построением конструктора,…
12 янв '17 в 21:25
2 ответа

Принудительная строгость для списков в haskell

Я сделал действительно трудоемкий алгоритм, который в результате выдает короткую строку. Когда я пытаюсь распечатать его (через putStrLn), он появляется на экране символ за символом. Я понял, почему это произошло, и попытался выполнить оценку строки…
3 ответа

Какова связь между распакованными типами и строгостью?

Распакованные типы, такие как Int#и строгие функции, как f (!x) = ..., это что-то другое, но я вижу концептуальное сходство - они каким-то образом запрещают громы и лень. Если бы Haskell был строгим языком, таким как Ocaml, каждая функция была бы ст…
28 июн '10 в 10:18
4 ответа

Является ли оператор && строгим в Хаскеле?

Например, у меня есть операция fnB :: a -> Bool это не имеет смысла, пока fnA :: Bool возвращается False, В КИ могут составить эти две операции в одну if блок: if( fnA && fnB(a) ){ doSomething; } и C будет гарантировать, что fnB не будет …
30 сен '11 в 15:21
3 ответа

Haskell складывает плохую производительность с (++)

У меня есть этот код: import Data.List newList_bad lst = foldl' (\acc x -> acc ++ [x*2]) [] lst newList_good lst = foldl' (\acc x -> x*2 : acc) [] lst Эти функции возвращают списки с каждым элементом, умноженным на 2: *Main> newList_bad [1.…