До сих пор я предполагал, что GHC выполняет функцию уровня типа (семейство типов) во время компиляции. Поэтому сообщение об ошибке, вызванное семейством типов TypeError, должно быть выдано во время компиляции.
В следующем примере я получаю ошибку типа во время выполнения.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
import GHC.TypeLits
type family If c t e where
If 'True t e = t
If 'False t e = e
type family EqSymbol (a :: Symbol) (b :: Symbol) where
EqSymbol a a = 'True
EqSymbol a b = 'False
type family Lookup (x :: Symbol) (l :: [(Symbol,t)]) :: t where
Lookup k '[] = TypeError (Text "Key not found: " :<>: Text k)
Lookup k ('(x,a) ': ls) = If (EqSymbol k x) a (Lookup k ls)
type TList = '[ '("foo", Int), '("bar", String)]
test1 :: Lookup "foo" TList
test1 = undefined
test2 :: Lookup "bar" TList
test2 = undefined
test3 :: Lookup "baz" TList
test3 = undefined
Для функции test3
оценка функции уровня типа Lookup
должна дать ошибку типа, поскольку baz не является ключом в TList
.
GHCi загружает код без ошибки типа:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :l SO.hs
[1 of 1] Compiling Main ( SO.hs, interpreted )
Ok, modules loaded: Main.
Запрос типов функций test1
, test2
дает ожидаемые результаты:
*Main> :t test1
test1 :: Int
*Main> :t test2
test2 :: [Char]
Запрос типа функции test3 дает ошибку типа, и функция TypeError выполняется только тогда, когда я пытаюсь вычислить функцию test3
:
*Main> :t test3
test3 :: (TypeError ...)
*Main> test3
<interactive>:5:1: error:
• Key not found: baz
• When checking the inferred type
it :: (TypeError ...)
Что мне нужно сделать, чтобы получить ошибку времени компиляции?
test3
. При проверке предполагаемого типа подразумевается время компиляции. Однако я не знаю, почему исходный файл компилируется. Возможно, вам нужно использоватьtest3
вместо того, чтобы просто определить его? - person chi   schedule 13.07.2017test4 = test3
дает ошибку при перезагрузке файла в GHCi. Спасибо! - person Jogger   schedule 13.07.2017