Что не так с моим синонимом типа Haskell?

У меня есть две функции для управления циклами, continue а также break:

type Control a = (a -> a) -> a -> a

continue :: Control a
continue = id

break :: Control a
break = const id

Затем я хотел упростить Control Введите синоним. Следовательно, я написал:

type Endo a = a -> a

type Control a = Endo (Endo a)

continue :: Control a
continue = id

break :: Control a
break = const id

Однако, когда я попытался еще больше упростить его, я получил ошибку:

GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> type Endo a = a -> a
Prelude> type Duplicate w a = w (w a)
Prelude> type Control a = Duplicate Endo a

<interactive>:4:1:
    Type synonym ‘Endo’ should have 1 argument, but has been given none
    In the type declaration for ‘Control’

Я не понимаю, почему я получаю эту ошибку. Возможно, вы могли бы просветить меня.

2 ответа

Решение

Как сказал Фрейзер, такого рода вещи не могут работать, потому что синонимы с частичным применением типов делают все неразрешимым.

Тем не менее, если вы бросаете в -XLiberalTypeSynonyms Расширение, GHC будет вставлять синонимы до тех пор, пока не сможет выполнить вывод:

Prelude> type Endo a = a -> a
Prelude> type Duplicate w a = w (w a)
Prelude> type Control a = Duplicate Endo a

<‌interactive>:4:1:
    Type synonym ‘Endo’ should have 1 argument, but has been given none
    In the type declaration for ‘Control’
Prelude> :set -XLiberalTypeSynonyms
Prelude> type Control a = Duplicate Endo a

Синонимы типа должны быть полностью применены все время. Вы не можете частично применить их.

Если вы намерены сделать это, вам, скорее всего, потребуется его новый тип.

Другие вопросы по тегам