Как работает Haskell printf?

Типовая безопасность 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

98
задан undur_gongor 15 July 2016 в 11:50
поделиться