繁体   English   中英

为什么`forall(a :: j)(b :: k)`与`forall(p ::(j,k))`的工作方式不同?

[英]Why does `forall (a :: j) (b:: k)` work differently than `forall (p :: (j,k))`?

我试图理解使用forall量化两个类型变量和使用forall来量化元组类型的单个类型变量之间的区别。

例如,给定以下类型系列:

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}

type family Fst (p :: (a,b)) :: a where
  Fst '(a,_) = a
type family Snd (p :: (a,b)) :: b where
  Snd '(_,b) = b
type family Pair (p :: (Type,Type)) :: Type where
  Pair '(a,b) = (a,b)

我可以使用两个类型变量在对上定义一个标识,并让它在GHC 8.0.1上编译:

ex0 :: forall (a :: Type) (b :: Type). Pair '(a,b) -> (Fst '(a,b), Snd '(a,b))
ex0 = id

如果我使用元组类型的单个类型变量,则相同的定义不会编译,但是:

ex1 :: forall (p :: (Type,Type)). Pair p -> (Fst p, Snd p)
ex1 = id
-- Ex.hs:20:7: error:
--     • Couldn't match type ‘Pair p’ with ‘(Fst p, Snd p)’
--       Expected type: Pair p -> (Fst p, Snd p)
--         Actual type: (Fst p, Snd p) -> (Fst p, Snd p)
--     • In the expression: id
--       In an equation for ‘ex1’: ex1 = id
--     • Relevant bindings include
--         ex1 :: Pair p -> (Fst p, Snd p) (bound at Ex.hs:20:1)

是,这个问题p可能

原因很简单,在类型级别上没有eta转换检查。 首先,没有机制可以将data定义与可能具有eta定律的单构造函数记录/产品区分开来。 我不认为p可能是是这个有效的原因。 即使在部分惰性语言中,对的eta等式也是有效的(wrt观察等价)。

是,这个问题p可能

或多或少。 不幸的是,所有种类都由空型家庭居住。

type family Any :: k

哪个理论允许你尝试做什么,这让人感到沮丧。 我认为它确实需要修复; 不过,我不确定是否有任何计划这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM