Необычные виды и конструкторы данных
Я не знаю, как я этого не заметил, но конструкторы данных и определения функций не могут использовать типы с другими типами, кроме *
и это варианты * -> *
и т.д., из-за (->)
подпись, даже под -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-разновидности здесь.