2016-03-14 2 views
3

В Ричард Айзенберга talk по работе с легкомыслием полиморфизмом для зависимых Haskell, он ясно показывает, что это суждение/тип звук:Налицо суждения имеют вид?

type Star = (* :: (* :: (* :: *))) 

Означает ли это, что типизации суждение сами имеют любезный *? Или, что более гибкий, в том, что *может иметь тип *или возвращаемый ... вещь от (* :: *) (который я не уверен, в этот момент).

Учитывая это предположение, что (* :: *) :: *, это также будет означать, что этот тип будет ассоциативным, тоже:

type Star = (((* :: *) :: *) :: *) 

который я не думаю, что это правильно. Может кто-нибудь прокомментировать это для меня?

ответ

11

Нет. Я думаю, вы неправильно истолковали, что происходит. :: на уровне типа, как :: на уровне значения. Рассмотрим:

three :: Int 
three = 3 :: (Int :: *) 

Это просто 3 :: Int который только 3. Уже в подписях Haskell + kind вы смогли написать: (((Int :: *) :: *) :: *), что точно так же, как Int. Или на простом Haskell 2010, (((3 :: Int) :: Int) :: Int). Раньше вы ограничивались тем, насколько далеко вы можете пойти «правильно связанным» способом, потому что виды сами по себе не имеют видов. Аксиома * :: * меняет это.

:: означает, что он всегда имел в виду. Я бы не рассматривал :: как оператор, который «что-то возвращает». Это всего лишь фрагмент синтаксиса, который позволяет предоставлять информацию проверяющему тип, но в остальном не имеет значения. Если вы действительно, действительно хотите посмотреть его как своего рода оператора, он будет вести себя как const, хотя было бы сложно записать, каков его «тип».

8

Это не типизированное суждение, а скорее типовое обозначение. Как правило, выражение foo :: bar имеет значение foo и тип bar (при условии, что средство проверки типов может дать оценку, что это звук). В качестве прямого следствия, то, что foo :: bar имеет тип *, является плоской неверной, если только bar не соответствует (0) *. Невозможно, насколько я знаю, в Haskell или GHC написать выражение, которое отражает суждение о наборе значений, но если бы это было так, то его тип также не был бы *.

+0

Будет ли само суждение чем-то вроде «как это было (успешно) утверждалось, что' foo' имеет тип 'bar'?, Может быть, путь вывода или что-то еще? Я думал, что видел что-то вроде стека вывода в GHC 8.0 из [одного из твитов Криса Аллена] (https://twitter.com/bitemyapp/status/698424851455832064), но я не уверен, что я прав. –

+1

@AthanClark Правильно, типизированное суждение было бы деревом типичных приложений правил, которое свидетельствует или доказывает, что данное выражение имеет заданный тип. –

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