令结合中间产生IO monad

时间:2016-03-18 08:29:49

标签: agda coinduction

鉴于此背景:

open import IO
open import Data.String
open import Data.Unit
open import Coinduction

postulate
  A : Set
  f : String → A
  g₁ g₂ : A → String

假设我想实现像

这样的东西
foo : IO ⊤
foo = ♯ readFiniteFile "input.txt" >>= \s →
      ♯ (♯ putStrLn (g₁ (f s)) >>
      ♯ putStrLn (g₂ (f s)))

by let - 绑定中间结果f s。我希望这会奏效:

foo₁ : IO ⊤
foo₁ = ♯ readFiniteFile "input.txt" >>= \s →
       let x = f s in
       ♯ (♯ putStrLn (g₁ x) >>
       ♯ putStrLn (g₂ x))

但是

失败了
  

未实现:coinductive构造函数的范围   let-bound变量

所以我尝试搬出

foo₂ : IO ⊤
foo₂ = ♯ readFiniteFile "input.txt" >>= \s →
       ♯ (let x = f s in
       ♯ putStrLn (g₁ x) >>
       ♯ putStrLn (g₂ x))

和以前一样的问题。

我设法通过解除启动步骤来解决这个问题:

_>>′_ : ∀ {a} {A B : Set a} → IO A → IO B → IO B
m >>′ m′ = ♯ m >> ♯ m′

foo₂ : IO ⊤
foo₂ = ♯ readFiniteFile "input.txt" >>= \s →
       ♯ let x = f s in
       putStrLn (g₁ x) >>′ putStrLn (g₂ x)

但是为什么如果“内联”版本不起作用呢?

1 个答案:

答案 0 :(得分:1)

仅供参考,这个问题是一个长期存在的问题,今天我正在看一下,在你提出问题前几天我注意到it had been fixed。该修补程序是当前发布的版本(版本2.5.1.1)的一部分。