我现在已经使用Agda 9个月了。这是我第一次发现自己想要"跑步" (作为顶级可执行文件)一个打印字符串的Agda程序。叫我老式。
我可以编写一个计算字符串的程序,并让Agda在交互模式(或Emacs)中向我显示字符串的值。但字符串很长并且嵌入了换行符。我希望它实际打印出来。
作为比较,在GHCi中,我可以这样做:
Prelude> putStrLn "hello, world!"
hello, world!
但是在Agda的互动模式中我得到了这个:
Main> putStrLn "hello, world!"
.IO.♯-15
('h' .Data.Colist.Colist.∷
.Data.Colist.♯-2 'h'
('e' .Data.List.List.∷
'l' .Data.List.List.∷
'l' .Data.List.List.∷
'o' .Data.List.List.∷
',' .Data.List.List.∷
' ' .Data.List.List.∷
'w' .Data.List.List.∷
'o' .Data.List.List.∷
'r' .Data.List.List.∷
'l' .Data.List.List.∷
'd' .Data.List.List.∷ '!' .Data.List.List.∷ .Data.List.List.[]))
>>
.IO.♯-16
('h' .Data.Colist.Colist.∷
.Data.Colist.♯-2 'h'
('e' .Data.List.List.∷
'l' .Data.List.List.∷
'l' .Data.List.List.∷
'o' .Data.List.List.∷
',' .Data.List.List.∷
' ' .Data.List.List.∷
'w' .Data.List.List.∷
'o' .Data.List.List.∷
'r' .Data.List.List.∷
'l' .Data.List.List.∷
'd' .Data.List.List.∷ '!' .Data.List.List.∷ .Data.List.List.[]))
那么,我如何采用如下的程序并运行它以便观察IO
值中累积的效果?
module Temp where
open import Data.Unit
open import IO
main : IO ⊤
main = putStrLn "Hello, world!"
我注意到在Agda的run
模块中声明了Haskell风格的IO
函数,但我还没有找到方法来提供帮助。
答案 0 :(得分:8)
Agda IO系统基本上有两层:较低层(IO.Primitive
)只是Haskell IO
的代理,较高层(IO
)是构建于其上的包装器顶部。
IO的问题在于终止检查器不能很好地发挥作用。因此,您无需使用{-# NON_TERMINATING #-}
定义每个函数,而是创建一个新的(共同)数据类型来描述IO操作,并将所有非终止问题集中在一个函数中run
。
run
函数只是将高级IO
类型给出的IO操作的描述转换为可由运行时系统运行的实际IO操作(IO.Primitive
)
以下是您的“Hello,world!”程序应如下所示:
open import IO
main = run (putStrLn "Hello, world!")