Описание тега 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' следующим об…
02 мар '16 в 00:55
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…
25 сен '16 в 12:09
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 делает такие вычисления строгими, но я не могу по…
31 май '16 в 06:40
2
ответа
Работа с бесконечными списками со строгими монадами
У меня есть функция f :: [a] -> b который работает с бесконечными списками (например, take 5, takeWhile (< 100) . scanl (+) 0 и так далее). Я хочу передать этой функции значения, сгенерированные строгими монадическими действиями (например, ran…
11 фев '17 в 05:32
3
ответа
Введите принудительное "строгое / непереносимое" подмножество / версию Haskell
Мне очень нравится Haskell, однако одна из главных вещей, которые касаются меня в Haskell, заключается в сложности рассуждений об использовании пространства. По сути, возможность использования thunks и рекурсии создает некоторые хитрые ситуации, ког…
19 апр '13 в 03:59
1
ответ
Пример снижения производительности из-за использования строгих конструкторов данных
Я читаю о строгих конструкторах данных. В связанной вики статье говорится, что "Аннотации строгости могут ухудшить производительность [потому что] аннотация строгости вынуждает компилятор обеспечить полную оценку поля перед построением конструктора,…
12 янв '17 в 21:25
2
ответа
Принудительная строгость для списков в haskell
Я сделал действительно трудоемкий алгоритм, который в результате выдает короткую строку. Когда я пытаюсь распечатать его (через putStrLn), он появляется на экране символ за символом. Я понял, почему это произошло, и попытался выполнить оценку строки…
05 апр '11 в 20:23
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.…
18 фев '13 в 14:27