Синонимы типов не могут быть частично применены.
Синоним типа - это всего лишь короткая рука, чтобы помочь программисту, а не то, что на самом деле существует, как о чем говорит язык Haskell. Единственный способ, которым Haskell может иметь дело с синонимом типа, - это «просмотреть» его, чтобы увидеть тип с правой стороны. Параметры просто дают вам своего рода «макроязык».
Так Maybe' a
точно соответствует forall b. (b -> (a -> b) -> b)
. Он ведет себя так же, как если бы вы написали forall b. (b -> (a -> b) -> b)
. Но что такое Maybe'
самостоятельно без аргумента?Haskell не может справиться с этим как Maybe'
, ему придется заменить его чем-то другим. Но что? Если бы это означало что-нибудь, это должно было бы быть чем-то вроде \a ~> (forall b. (b -> (a -> b) -> b)
, где я использую \a ~> ...
в качестве псевдосинтакса для лямбда уровня уровня; произвольная функция от типа к другому типу. Причина, по которой мне пришлось составлять синтаксис, заключается в том, что у Haskell нет синтаксиса для этого, и причина, по которой у него нет синтаксиса, заключается в том, что он не может обрабатывать полностью общие функции уровня.
Я не уверен, что поддержка произвольных ямбдов типа типа (типа конструкторов и семейств типов фактически очень ограниченных форм этого) была бы фактически невозможна, но это, безусловно, очень сложно. Таким образом, синонимы типов не могут быть частично применены.
Чтобы получить что-то, что можно сделать экземпляром Monad
(который нужно что-то, что может быть применен к типу, чтобы сделать что-то типа - доброго * -> *
), вам нужно использовать data
или newtype
создать конструктор типа. Синоним типа не может использоваться для этой цели.
Эх, извините, что это педант, но вы еще не изобрели нового. Возможно, вы заново открыли его ** Церковное кодирование ** - см. Здесь, например, - https://gist.github.com/rampion/2176199 –
Я придумал один и тот же ответ независимо от googling «Церковное кодирование Может быть» lol. Я не украл ваш ответ. – nponeccop
Забавный факт: рассматриваемый как предложение, ваш 'Maybe (A)' является 'FALSE -> NOT (NOT (A))', который классически эквивалентен 'TRUE OR A' - дизъюнкции типа единицы' () 'и введите' A'. –