() как пустое ограничение - PullRequest
0 голосов
/ 09 мая 2018

как можно представить пустое ограничение?

для следующего файла

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE KindSignatures #-}

import Data.Kind(Type, Constraint)

type Empty = (() :: Type -> Constraint)

main :: IO ()
main = return ()

ghc 8.2.2 ответов

constraint.hs:6:15: error:
    • Expected kind ‘* -> Constraint’, but ‘()’ has kind ‘*’
    • In the type ‘(() :: Type -> Constraint)’
      In the type declaration for ‘Empty’
  |
6 | type Empty = (() :: Type -> Constraint)
  |  

что мне не хватает?

я знаю о следующем решении

{-# LANGUAGE FlexibleInstances #-}

class Empty x
instance Empty x

но я хочу знать, почему () не работает

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Ответ Джона Перди правильный. Если вы хотите одну вещь, которую вы можете использовать независимо от арности (за исключением главы экземпляра или семейства типов LHS), вам нужно будет использовать несколько шаблонов:

{-# language PolyKinds, ConstraintKinds, FlexibleInstances,
    MultiParamTypeClasses, TypeFamilies #-}

import Data.Kind (Constraint)

class Unit1 a
instance Unit1 a
class Unit2 a b
instance Unit2 a b
...

type family Unit :: k
type instance Unit = (() :: Constraint)
type instance Unit = Unit1
type instance Unit = Unit2
...

Тогда

Prelude K> type Empty = (Unit :: Type -> Constraint)
Prelude K> :kind! Empty
Empty :: * -> Constraint
= Unit1
0 голосов
/ 09 мая 2018

() имеет вид * или Constraint, в зависимости от контекста, никогда не a -> Constraint. Точно так же (,) имеет вид * -> * -> * или Constraint -> Constraint -> Constraint, в зависимости от контекста.

- Саймон Пейтон-Джонс

Просто () перегружен только для того, является ли он типом или ограничением. То есть вы бы написали () => a, а не (() a) => a. Поэтому я думаю, что это:

class Empty x
instance Empty x

Это правильное решение здесь. (И, возможно, что-то подобное должно быть в base.)

0 голосов
/ 10 мая 2018

Любой из этих вариантов отлично работает, в зависимости от того, что вы хотите:

type Empty = (() :: Constraint)
type ConstEmpty x = (() :: Constraint)
0 голосов
/ 09 мая 2018

() имеет вид Constraint и не предназначен для применения к Type.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...