Haskell 在模式匹配中,构造器的通用存在量词可以转换吗?
下面是一个我认为(类型)有意义的片段,但ghc不喜欢它。 我希望通过巧妙地使用类型注释可以使它工作,但我的实验失败了。 有什么建议吗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
{-# 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。