我正在使用ConstraintKinds
和MultiParamTypeClasses
来获取由另一个类参数化的类。
假设Foo m
指出了指向约束m
的类型,即(m a) => a
。因此,我尝试使用它来构造一些Bar m
。
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
class Foo m where
foo :: (m a) => a
data Bar m where
Bar :: ((m a) => a) -> Bar m
bar :: Foo m => Bar m
bar = Bar foo
但是出现以下错误。
Could not deduce (Foo m0) arising from a use of ‘foo’
from the context: Foo m
从上下文来看,m0
应该是m
。有没有办法使这项工作?
我认为现在的问题是,我可以先定义一些Foo Pointed a
,然后定义一些Foo Pointed2 a
,在这种情况下,foo
将不知道返回什么,对吗?我的想法是,我将调用(bar :: Bar Pointed)
或(bar :: Bar Pointed2)
并得到两个不同的结果。这样的事情可能吗?为什么不呢?
答案 0 :(得分:2)
您似乎可以使用类型应用程序执行此操作,以帮助GHC找出您在谈论的约束:
bar :: forall m . (Foo m) => Bar m
bar = Bar (foo @m)