首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能强制约束呢?

我怎样才能强制约束呢?
EN

Stack Overflow用户
提问于 2021-05-16 13:40:35
回答 1查看 175关注 0票数 5

有没有任何机制来强制Haskell (除了unsafeCoerce,我希望这是可行的)约束?

代码语言:javascript
复制
{-# 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-16 16:45:38

只要稍微修改一下,你就会要求进行亲切的检查。

代码语言:javascript
复制
newtype K a ph = K {unK :: a}
-- I would want c a => c ((K a) i)
-- for any c :: Type -> Constraint

不管是现在还是将来,你绝对不能得到它,因为它是无效的。考虑一下

代码语言:javascript
复制
(~) Bool :: Type -> Constraint

现在(~) Bool Bool保持不变,但您永远无法实现(~) Bool (K Bool i)

如果没有平等约束呢?我也可以这样做,用莱布尼兹等式:

代码语言:javascript
复制
class Bar a where
  isBool :: f a -> f Bool

instance Bar Bool where
  isBool = id

但是,没有办法编写instance Bar (K Bool i),因为它的isBool没有触底。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67557365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档