Как сделать таблицу (Data.Map) строгой в haskell? - PullRequest
4 голосов
/ 14 мая 2011

Для изучения Хаскеля (хороший язык) я испытываю проблемы с Спой .

У меня есть таблица с 19000 элементами, известными во время компиляции. Как я могу сделать таблицу строгой с 'seq'? Вот (сильный) упрощенный пример из моего кода.

import qualified Data.Map as M

-- table = M.fromList . zip "a..z" $ [1..]  --Upps, incorrect. sorry
table = M.fromList . zip ['a'..'z'] $ [1..]

Ответы [ 2 ]

5 голосов
/ 14 мая 2011

Я думаю, что вы ищете deepseq в Control.DeepSeq, который используется для принудительной полной оценки структур данных.

Его сигнатура типа deepseq :: NFData a => a -> b -> b, и она работает, полностью оценивая свой первыйаргумент перед возвратом второго.

table = t `deepseq` t
  where t = M.fromList . zip ['a'..'z'] $ [1..]

Обратите внимание, что здесь все еще остается некоторая лень.table не будет оцениваться, пока вы не попытаетесь его использовать, но в этот момент будет оценена вся карта.

Обратите внимание, что, как указал Луки, Data.Map уже строг в своих ключах,это имеет смысл только в том случае, если вы хотите, чтобы оно было строгим и по своим значениям.

3 голосов
/ 14 мая 2011

Общий ответ: вы пишете код, который должен форсировать оценку всей структуры данных.Например, если у вас есть список:

 strictList xs = if all p xs then xs else []
      where p x = x `seq` True

Я уверен, что уже существует некоторый класс типов, который будет применять такое принудительное рекурсивное использование и экземпляры для стандартных типов данных.

...