Типовая безопасность Haskell уступает никакому только языкам с зависимой типизацией. Но с Text.Printf творится какая-то глубокая магия, которая кажется довольно нестабильной.
> printf "%d\n" 3
3
> printf "%s %f %d" "foo" 3.3 3
foo 3.3 3
В чем заключается глубокая магия, стоящая за этим? Как может Text.Printf.printf
Функция принимает вариативные аргументы, подобные этой?
Каков общий метод, используемый для разрешения вариативных аргументов в Haskell, и как он работает?
(Примечание: некоторая безопасность типов явно теряется при использовании этого метода.)
> :t printf "%d\n" "foo"
printf "%d\n" "foo" :: (PrintfType ([Char] -> t)) => t