Haskell 的 Agda 中的 Arrow-Class 和 Agda 中的 ->

标签 haskell agda arrows

我有两个密切相关的问题:

首先,如何在 Agda 中建模/表示 Haskell 的 Arrow 类?

 class Arrow a where 
      arr :: (b -> c) -> a b c
      (>>>) :: a b c -> a c d -> a b d
      first :: a b c -> a (b,d) (c,d)
      second :: a b c -> a (d,b) (d,c)
      (***) :: a b c -> a b' c' -> a (b,b') (c,c')
      (&&&) :: a b c -> a b c' -> a b (c,c')

(下面的 Blog Post 表明它应该是可能的...)

其次,在 Haskell 中,(->) 是一等公民,也是另一种高阶类型,可以直接将 (->) 定义为Arrow 类的一个实例。但 Agda 的情况如何呢?我可能是错的,但我觉得 Agdas -> 比 Haskell 的 -> 是 Agda 更不可或缺的一部分。那么,Agdas -> 是否可以被视为高阶类型,即产生 Set 的类型函数,它可以成为 Arrow 的实例?

最佳答案

类型类通常在 Agda 中编码为记录,因此您可以将 Arrow 类编码为如下所示:

open import Data.Product -- for tuples

record Arrow (A : Set → Set → Set) : Set₁ where
  field  
    arr    : ∀ {B C} → (B → C) → A B C
    _>>>_  : ∀ {B C D} → A B C → A C D → A B D
    first  : ∀ {B C D} → A B C → A (B × D) (C × D)
    second : ∀ {B C D} → A B C → A (D × B) (D × C)
    _***_  : ∀ {B C B' C'} → A B C → A B' C' → A (B × B') (C × C')
    _&&&_  : ∀ {B C C'} → A B C → A B C' → A B (C × C')

虽然您不能直接引用函数类型(诸如 _→_ 之类的语法不是有效语法),但您可以为其编写自己的名称,然后在编写函数时可以使用该名称实例:

_=>_ : Set → Set → Set
A => B = A → B

fnArrow : Arrow _=>_  -- Alternatively: Arrow (λ A B → (A → B)) or even Arrow _
fnArrow = record
  { arr    = λ f → f
  ; _>>>_  = λ g f x → f (g x)
  ; first  = λ { f (x , y) → (f x , y) }
  ; second = λ { f (x , y) → (x , f y) }
  ; _***_  = λ { f g (x , y) → (f x , g y) }
  ; _&&&_  = λ f g x → (f x , g x)
  }

关于Haskell 的 Agda 中的 Arrow-Class 和 Agda 中的 ->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13112642/

相关文章:

haskell - 2 个类似的 Haskell 函数使用 do 符号返回相同的结果,但一个被调用多次

Haskell 生成预过滤排列

agda - 我可以使用值的范式来避免 Agda 中不完整的模式匹配吗?

haskell - mapA 如何与 Haskell 中的流函数 Arrow 配合使用?

haskell - 奇怪的 ghc 错误消息, "My brain just exploded"?

haskell - GHCi 中定义的函数中的非穷尽模式

haskell - 列出 Haskell 中的惰性求值

vector - Agda:Stdlib 中的向量成员资格? (以及一般如何学习 stdlib)

agda - Modulo 的这个公式是一个集合吗?

haskell - HXT:左因子非确定性箭头?