【问题标题】:How "with" keyword works in agda ?? and also the code below ??“with”关键字在 agda 中如何工作?还有下面的代码??
【发布时间】:2015-05-08 07:57:50
【问题描述】:

我无法清楚地理解它。我试图学习“with”关键字,但我也有疑问。请帮忙 !!!

我想了解“with”的工作原理和这段代码的工作原理。

something-even : ∀ n → Even n ⊎ Even (suc n)
something-even zero = inj₁ zero
something-even (suc n) with something-even n
... | inj₁ x = inj₂ (suc-suc x)
... | inj₂ y = inj₁ y
(this states that either n is even or its successor is even). In fact, thm0 can be implemented without using recursion!

thm0 : ∀ x → ∃ λ y → Even y × x less-than y
thm0 n with something-even n
... | inj₁ x = suc (suc n) , suc-suc x , suc ref
... | inj₂ y = suc n , y , ref

【问题讨论】:

    标签: agda


    【解决方案1】:

    如果您熟悉 Haskell,您会注意到在 Agda 中没有 if-statements 和 case

    with 对表达式结果进行模式匹配。例如,with something-even n 计算 something-even n,然后在以下行中与 ... | inj₁ x... | inj₂ y 进行模式匹配。这些匹配表达式,查看其值是使用inj₁ 还是inj₂ 构造函数构造的,以便它们包装的值可以在右侧表达式中使用:suc (suc n) , suc-suc x , suc ref 使用x 确定inj₁ xsuc n , y , ref 使用由 inj₂ y 确定的 y

    实际的构造函数名称来自 的定义——参见something-even 的类型连接类型Even nEven (suc n)。因此,inj₁ x 中的x 对应于给定nEven n 类型的值,inj₂ y 中的y 对应于相同Even (suc n)Even (suc n) 类型的值。

    【讨论】:

    • if_then_else_Data.Bool 中定义。 Agda 有模式匹配的 lambda,除了通常的 case_of_,在 Function 中也有依赖的 case_return_of_。您可以找到示例here。此外,出于效率原因,最好尽可能使用 case-expressions 而不是 with
    • @user3237465 我同意。然而,我只需要解释with的含义。 Agda 没有将case..of 定义为关键词,所以即使你是对的,我也不认为我错了:-)。此外,如果您能详细说明case_of_with 相比的效率,那就太好了。我希望他们以同样的方式完成。
    • with 生成一个辅助函数,如wiki 中所述。请查看this 线程以获取一个戏剧性的示例。
    • @user3237465 嗯,但模式匹配 lambda 也可以...好吧,我会读那个线程
    • @ajayv 你也可以投票或接受答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2014-08-18
    • 2017-11-21
    相关资源
    最近更新 更多