Haskell 在模式匹配中,构造器的通用存在量词可以转换吗?

Haskell 在模式匹配中,构造器的通用存在量词可以转换吗?,haskell,Haskell,下面是一个我认为(类型)有意义的片段,但ghc不喜欢它。 我希望通过巧妙地使用类型注释可以使它工作,但我的实验失败了。 有什么建议吗 {-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} module Ex where data T a where T :: Functor f => (f a -> a) -> T a foo :: (forall

下面是一个我认为(类型)有意义的片段,但ghc不喜欢它。 我希望通过巧妙地使用类型注释可以使它工作,但我的实验失败了。 有什么建议吗

{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Ex where

data T a where
  T :: Functor f => (f a -> a) -> T a

foo :: (forall a . T a) -> Bool
foo (T f) = bar f

bar :: Functor f => (forall a . f a -> a) -> Bool
bar _f = True

这很可能是不可能的,因为它相当于交换一个普遍存在的量词,但我希望如此。

我在Agda中尝试过这个例子, 看看这是否有意义

module Comm where

open import Data.Bool using (Bool; true)

record T (A : Set) : Set₁ where
  constructor MkT
  field
    F : Set → Set
    f : F A → A

bar : {F : Set → Set} → (∀ A → F A → A) → Bool
bar _ = true

foo : (∀ A → T A) → Bool
foo k = bar {F = k Bool .T.F} λ A → {!k A .T.f!}
-- Goal: k Bool .T.F A → A
-- Have: T.F. (k A) A → A
在foo中,我们需要为所有a实例化
。T a
带有某种类型。 由于类型是参数化的,所以任何类型都可以,并且
F
都是相同的。 但无论是Agda还是Haskell都没有内置这种参数

因此,我认为正确使用
非安全性
, 事情会成功的

{-#语言GADTs}
{-#语言等级}
{-#语言范围类型变量#-}
{-#语言类型应用程序{-}
模块exwhere
导入不安全。强制(不安全强制)
导入Data.List.NonEmpty(非空(..)
导入GHC.Exts(任何)
数据在哪里
函子f=>(fa->a)->ta
函子f=>(对于所有a.fa->a)->Bool
条形图_f=_f`seq`True
foo::(对于所有a.T.a)->Bool
foot=foot't
foo':(对于所有a.T.a)->T Any->Bool
foo't(tf)=辅助f,其中
所有f。函子f=>(f Any->Any)->Bool
辅助f'=条形f''
哪里
f''::对于所有a。f a->a
f'=不安全力f'
---试验
例如:全部a。塔塔
ex=T(\(x:|u)->x)
例2:布尔
ex2=foo-ex

我认为这没有意义。考虑<代码> E::Tα;ex=T getConst。这里的
f~常数a
取决于
a
,而要在代码中调用
bar
,您需要选择单个函子
f
,然后将
传递给所有b。f b->b
。后者看起来像所有b的
。常量a b->b
不可能实现(没有底部)。事实上,您正在尝试将forall exists转换为exists forall(这样做甚至不引入选择函数)。我没有一个“很好”的反例来说明你的具体情况,但这看起来是不可能的。我想你想要比你所写的更一般的东西。如前所述,
bar
似乎无法生成一个
f t
值来传递给参数函数或
fmap
,因此它必须是一个参数常量(?)可以详细说明吗?
ta
包含一个函数,用于从
f a
中为某些
f
或其他对象提取
a
。如果不知道
f
是什么,我们真的无法为该函数提供非底部参数。因此,
T
从根本上看似乎毫无用处。这不是一个有用的例子,只是一个很小的例子。我不同意“
F
将是相同的”。见我上面的评论。@chi
。T a
为所有a生成
F
。常数a
。这些,都是一样的。有了GADT,你可以打破它,但GADT不是(合法的)
Functor
s。