Я пишу интерпретатор для динамически типизированного языка в Haskell.
Как и большинству интерпретаторов языков с динамической типизацией, моя программа также нуждается в проверке типов во время выполнения. Один из наиболее часто используемых кодов в моей программе:
interpreterFunction :: Value -> SomeMonadicContext ReturnType
interpreterFunction p = do
VStr s <- ensureType p TString
..
some code that uses s
Здесь я проверяю, что p
имеет тип TString
, и после этого я деструктурирую его с помощью VStr s <- ...
. Это никогда не дает сбоев, потому что VStr
— это единственное значение, имеющее тип TString
.
Мои структуры данных в основном таковы:
data Value = VStr String | VInt Int | VBool Bool
data Type = TStr | TInt | TBool
Поэтому я разделяю свои значения в зависимости от их типов. т.е. У меня есть только один конструктор значений с типом TStr
.
Теперь мне интересно, есть ли способ упростить мою функцию ensureType
и деструктурирующий код. Например, возможно ли такое:
interpreterFunction p = do
s <- ensureType p
..
same code that uses s
Здесь из кода после s <-
можно сделать вывод, что s
имеет тип String
, и статически известно, что только конструктор Value
, который имеет часть String
, является VStr
, поэтому ensureType
возвращает String
после динамической проверки, является ли p
VStr
.
Я на самом деле понятия не имею, имеет ли это смысл или возможно. Я просто ищу способы улучшить свой дизайн с помощью расширенных функций системы типов Haskell.
Любая помощь будет оценена.
ensureType
при наличии данных, отличных от TString. - person AndrewC   schedule 25.02.2013interpreterFunction (VStr s) = some code that uses s
, за которым следуетinterpreterFunction _ = some error handling code
. В противном случае, я думаю, вам следует внимательно изучить защиты шаблонов, потому что они могут оказывать уточняющее влияние на ваш код. - person AndrewC   schedule 25.02.2013String
доVStr
, гдеVStr
— новый тип), которые могут быть инъективными или нет. - person jberryman   schedule 25.02.2013throwError $ TypeError expected found
и еще кое-что сделать. - person sinan   schedule 25.02.2013