我定义了一个通用的类型(我称之为“异构”类型,但我不知道是否正确):
data Heterotype f = forall a. f a => Heterotype a
随后,我决定创建一个函数,允许您从多态值创建异构类型:
hset :: (forall a. f a => a) -> Heterotype f
hset x = Heterotype x
然而,GHC报错如下:
████████.hs:15:10: error:
* Could not deduce: f a0 arising from a use of `Heterotype'
* In the expression: Heterotype x
In an equation for `hset': hset x = Heterotype x
* Relevant bindings include
x :: forall a. f a => a
(bound at ████████.hs:15:6)
hset :: (forall a. f a => a) -> Heterotype f
(bound at ████████.hs:15:1)
|
15 | hset x = Heterotype x
| ^^^^^^^^^^^^
< p > 编辑: 以下扩展已启用:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GADTs, ScopedTypeVariables #-}
{-# LANGUAGE NoStarIsType, ConstraintKinds #-}
{-# LANGUAGE AllowAmbiguousTypes, RankNTypes #-}
import Data.Kind
mempty :: forall a. Monoid a => a
。 - schuelerminef
,它可能是Monoid
,但也可能是其他东西。 - chip :: F a => a
,那么我可以调用newhset p :: Heterotype F
。为什么我不能编写一个只接受这种多态值x :: F a => a
并将它们放入newhset
的函数呢?我想可以定义一个过于具体化的函数版本。 - schuelerminep
,那么您需要使用普遍量化而不是存在量化,即data Heterotype f = Heterotype (forall a. f a => a)
,其中可以定义newhset = Heterotype
。您发布的版本使用了存在量化,这要求某些类型满足F
。 - chi