Необычные виды и конструкторы данных

Я не знаю, как я этого не заметил, но конструкторы данных и определения функций не могут использовать типы с другими типами, кроме * и это варианты * -> * и т.д., из-за (->)подпись, даже под -XPolyKinds,

Вот код, который я пробовал:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}

data Nat = S Nat | Z

data Foo where
  Foo :: 'Z -> Foo -- Fails

foo :: 'Z -> Int -- Fails
foo _ = 1

Я получаю следующую ошибку:

<interactive>:8:12:
    Expected a type, but ‘Z’ has kind ‘Nat’
    In the type signature for ‘foo’: foo :: 'Z -> Int

Почему бы нам не разрешить сопоставление с нетрадиционными видами?

1 ответ

Решение

Не существует 1 такой вещи как "типы с другими видами, кроме * ". Добрый * это тип для типов, так же, как Int тип для чисел размером с машину; другие виды могут содержать элементы, которые напоминают типы или могут быть преобразованы в типы или используются для индексации типов или чего-либо еще, но не являются типами как таковыми, а просто "объектами уровня типа".


1 Как обычно, я игнорирую unbox-разновидности здесь.

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