【发布时间】:2018-12-18 03:22:42
【问题描述】:
我正在讨论类型驱动的开发,并且有一个关于类型良好的printf 的部分,其中类型是从第一个参数计算出来的,它是一个格式字符串:
printf : (fmt : String) -> PrintfType (toFormat (unpack fmt))
toFormat 从List Char 创建格式表示,PrintfType 从这样的格式表示中创建函数类型。完整代码在这里:https://github.com/edwinb/TypeDD-Samples/blob/master/Chapter6/Printf.idr
我了解printf "%c %c" 'a' 'b' 之类的代码是怎么回事——printf "%c %c 的类型被计算为Char -> Char -> String。
我不明白的是,当第一个参数在运行时未知时会发生什么。我理解为什么一般这样的代码不应该编译:如果用户在运行时输入格式字符串和结果类型,则在编译时无法知道它们,但我不知道不知道这种直觉背后的实际技术推理。
例如:
main : IO ()
main = do fmt <- getLine
c1 <- getChar
c2 <- getChar
printf fmt c1 c2
导致以下错误消息:
When checking an application of function Prelude.Monad.>>=:
printf fmt does not have a function type (PrintfType (toFormat (unpack fmt)))
我想我正在尝试理解此错误消息。 Idris 是否将此类函数视为特例?
【问题讨论】: