将Agda程序输出到控制台

时间:2014-09-25 12:44:30

标签: io main agda

我现在已经使用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函数,但我还没有找到方法来提供帮助。

1 个答案:

答案 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!")