Прочитав эту страницу, посвященную экзистенциальным системам в Haskell, я был вынужден проверить пределы такого поведения, поэтому я написал следующий фрагмент кода:
{-# LANGUAGE ExistentialQuantification #-}
data Showable = forall a. Show a => MkShowable a
pack :: Show a => a -> Showable
pack = MkShowable
instance Show Showable where
show (MkShowable x) = show x
Тип Showable
очень похож на тип ShowBox
, созданный в вышеупомянутой ссылке. Затем я создал этот надуманный пример, чтобы проиллюстрировать свой вопрос.
showSomething :: Bool -> Showable
showSomething True = pack 1
showSomething False = pack "ABC"
main :: IO ()
main = do
x <- getLine
let y = read x
print $ showSomething y
Этот код (который работает нормально) запрашивает у пользователя ввод (который должен быть «Истина» или «Ложь»), а затем выводит 1
, если это правда, или "ABC"
, если это ложь.
Но я не могу полностью понять, как система это делает. Математически это имеет смысл. Но я не понимаю, как компьютер может это решить. Мне кажется, что система во время выполнения принимает решение о том, следует ли вызывать экземпляр show
Int
или функцию show
String
, но это подразумевает существование чего-то вроде виртуальных таблиц C++, о которых я не думаю, что в Haskell есть концепция.
Мой вопрос: как это решить? Система не может знать заранее, собираюсь ли я ввести true или false, поэтому она не может знать, какой show
вызывать во время компиляции, но она явно работает в обоих случаях.
Showable =>
. - person arrowd   schedule 13.12.2014