我怎样才能强制约束?
How can I coerce constraints?
在 Haskell 中是否有任何强制约束的机制(我希望在 unsafeCoerce
旁边有效)?
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeApplications #-}
module CatAdjonctionsSOQuestion where
import Data.Proxy
import Data.Tagged
import Unsafe.Coerce
newtype K a ph = K {unK :: a} -- I would want c a => c ((K a) i) for any c :: Constraints
-- I could do any possible instance by hand
deriving via a instance Semigroup a => Semigroup ((K a) i)
-- I want them all
-- deriving via a instance c ((K a) i) -- Instance head is not headed by a class: c (K a i)
data Exists c where
Exists :: c a => a -> Exists c
data ExistsKai c i where
ExistsKai :: c ((K a) i) => Proxy a -> ExistsKai c i
ok :: forall x c i. (forall x. (forall a. c a => a -> x) -> x) -> (forall a. c ((K a) i) => Tagged a x) -> x
ok s k =
let e = (s Exists :: Exists c)
in let f = unsafeCoerce e :: ExistsKai c i
in case f of (ExistsKai (Proxy :: Proxy a)) -> unTagged (k @a)
稍作修改,以供实物检查,您要求
newtype K a ph = K {unK :: a}
-- I would want c a => c ((K a) i)
-- for any c :: Type -> Constraint
你绝对不能得到它,现在或永远,因为它是无效的。考虑
(~) Bool :: Type -> Constraint
现在 (~) Bool Bool
成立,但你永远无法达到 (~) Bool (K Bool i)
。
如果没有等式约束呢?好吧,我也可以这样做,使用莱布尼兹等式:
class Bar a where
isBool :: f a -> f Bool
instance Bar Bool where
isBool = id
但是没办法写instance Bar (K Bool i)
isBool
没有见底
在 Haskell 中是否有任何强制约束的机制(我希望在 unsafeCoerce
旁边有效)?
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeApplications #-}
module CatAdjonctionsSOQuestion where
import Data.Proxy
import Data.Tagged
import Unsafe.Coerce
newtype K a ph = K {unK :: a} -- I would want c a => c ((K a) i) for any c :: Constraints
-- I could do any possible instance by hand
deriving via a instance Semigroup a => Semigroup ((K a) i)
-- I want them all
-- deriving via a instance c ((K a) i) -- Instance head is not headed by a class: c (K a i)
data Exists c where
Exists :: c a => a -> Exists c
data ExistsKai c i where
ExistsKai :: c ((K a) i) => Proxy a -> ExistsKai c i
ok :: forall x c i. (forall x. (forall a. c a => a -> x) -> x) -> (forall a. c ((K a) i) => Tagged a x) -> x
ok s k =
let e = (s Exists :: Exists c)
in let f = unsafeCoerce e :: ExistsKai c i
in case f of (ExistsKai (Proxy :: Proxy a)) -> unTagged (k @a)
稍作修改,以供实物检查,您要求
newtype K a ph = K {unK :: a}
-- I would want c a => c ((K a) i)
-- for any c :: Type -> Constraint
你绝对不能得到它,现在或永远,因为它是无效的。考虑
(~) Bool :: Type -> Constraint
现在 (~) Bool Bool
成立,但你永远无法达到 (~) Bool (K Bool i)
。
如果没有等式约束呢?好吧,我也可以这样做,使用莱布尼兹等式:
class Bar a where
isBool :: f a -> f Bool
instance Bar Bool where
isBool = id
但是没办法写instance Bar (K Bool i)
isBool
没有见底