2016-09-01 3 views
2

Это упрощенная версия моей проблемы.Типы фантомов в Haskell

У меня рекурсивная структура данных (Stream1). Когда я вводил фантомные типы (поток a), рекурсивное описание (т. Е. T1) больше не работает. С другой стороны, t2 отлично работает, создавая бесконечную структуру, так как напрямую использует Stream1. Мне нужно использовать preI конструктора, например, в t1. Что мне не хватает? Мне нужно t1 вести себя как t2, т. Е. Возвращать бесконечный поток.

data Stream a = Stream Stream1 
    deriving (Eq, Show) 

data Stream1 = PreI Integer Stream1 
    deriving (Eq, Show) 

preI :: Integer -> Stream Int -> Stream Int 
preI n (Stream s) = Stream (PreI n s) 

t1 :: Stream Int 
t1 = let x = preI 0 x 
    in x 

t2 :: Stream Int 
t2 = let x = PreI 0 x 
    in Stream x 
+0

Вы не сказали, в чем проблема, но попробуйте изменить 'Stream' на' newtype' (вместо 'data'). – melpomene

+0

(Я обновил описание проблемы) Да, это, похоже, решило проблему. Большое спасибо! – ami

ответ

6
preI :: Integer -> Stream Int -> Stream Int 
preI n (Stream s) = ... 
    -- ^^^^^^^^^^ 

Это сопоставление с образцом заставляет аргумент до любого вывода производится. Для потоков это плохо, так как он удерживает наименьшую неподвижную точку внизу (без прерывания) вместо бесконечного потока.

Вы можете попробовать ленивый/неопровержимый шаблон соответствие вместо:

preI :: Integer -> Stream Int -> Stream Int 
preI n ~(Stream s) = Stream (PreI n s) 
    --^

Это по существу означает:

preI :: Integer -> Stream Int -> Stream Int 
preI n z = Stream (PreI n s) 
    where s = case z of Stream x -> x 

, который первым производит Stream, PreI на выходе, и только потом начинает разворачивать свой вклад (что происходит, когда используется s).

Или, еще лучше, измените Stream от data до newtype: таким образом, соответствие шаблону всегда будет ленивым. Действительно, используя newtype, у нас больше нет обертывания во время выполнения, а сопоставление шаблонов на самом деле не работает.

+0

Спасибо, chi. Изменение трюка от 'data' до' newtype' сделало трюк. – ami

Смежные вопросы