Продолжение темы про литералы в типах (доступно в ghc 7.6.2).

Sep 21, 2012 01:38

Вот тут подробности: http://hackage.haskell.org/trac/ghc/wiki/TypeNats/Basics

Что из этого можно вывести? А вот, что.

data Field (s :: Symbol) = Field String deriving (Show)

field :: Sing (s :: Symbol) -> Field (s :: Symbol)
field s = Field (fromSing s)

field (Sing "qq") с типом Field "qq" будет отличаться типом от field (Sing "haha") (тип Field "haha"). Их случайно не перепутать.

Понятно, что к таким типам применимы практически все интересные вещи, например, можно задать типы в БД:

type instance FieldType (Field "qq") = Varchar 20 -- здесь другой литерал, целое число.

Помимо Field, можно сделать и Table. К Table подцепить HList полей (с проверкой на отсутствие дубликатов, например) и мы получили описание БД с понятными именами, но без применения магии Template Haskell.

строгая типизация, системы типов, Хаскель

Previous post Next post
Up