Что не так с моим синонимом типа 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’

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


person Aadit M Shah    schedule 30.07.2015    source источник


Ответы (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
person leftaroundabout    schedule 30.07.2015

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

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

person Fraser    schedule 30.07.2015
comment
Этот. Duplicate Endo a допустимо, если Endo является data или newtype, но нет, если это просто type. - person MathematicalOrchid; 30.07.2015
comment
см. здесь и здесь для получения дополнительной информации. суть в том, что вывод о частично применяемых синонимах неразрешим - person Fraser; 30.07.2015