鉴于此背景:
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)
但是为什么如果“内联”版本不起作用呢?
答案 0 :(得分:1)
仅供参考,这个问题是一个长期存在的问题,今天我正在看一下,在你提出问题前几天我注意到it had been fixed。该修补程序是当前发布的版本(版本2.5.1.1)的一部分。