gpt4 book ai didi

haskell - 我可以将类型类字典显式传递给函数吗?

转载 作者:行者123 更新时间:2023-12-04 12:05:33 25 4
gpt4 key购买 nike

假设我有一些类型类:

data Foo = Foo deriving (Show)

class Monad m => MonadFoo m where
getFoo :: m Foo

由于 GHC 通过字典传递实现类型类(尽管使用了 SPECIALIZE),它有效地转换了 getFoo在引擎盖下类似于以下内容:
data MonadFooDict m = MonadFooDict { getFoo :: m Foo }

...并在调用 getFoo 的开头插入一个附加参数把字典穿在身上。

有时,我可能想动态选择一个实例,所以自己传递一个字典可能是可取的。我可以通过创建一个实例来模拟这个,该实例将为我遍历字典。
newtype DynamicMonadFoo a = DynamicMonadFoo
{ runFoo :: MonadFooDict DynamicMonadFoo -> a }
deriving ( Functor, Applicative, Monad
, MonadReader (MonadFooDict DynamicMonadFoo) )

instance MonadFoo DynamicMonadFoo where
getFoo = join $ asks _getFoo

现在,给定一些带有 MonadFoo 的函数约束,我可以使用 runFoo函数将其传递给显式类型类字典:
showCurrentFoo :: MonadFoo m => m String
showCurrentFoo = do
foo <- getFoo
return ("current foo: " ++ show foo)

ghci> runFoo showCurrentFoo MonadFooDict { _getFoo = return Foo }
"current foo: Foo"

这真的很酷,但它似乎是一项简单的任务,GHC 可能会公开某种库来执行此操作而无需所有样板(理想情况下,以一种可以更好地与非单子(monad)类型类一起工作的方式)。鉴于 GHC 具有一些“反射式”功能,例如 Data.Typeable ,这似乎不在可能性范围之外,但我不确定它是否真的以某种形式存在。

任何现有的内置插件或其他库是否允许更自动地执行此操作?

最佳答案

Haskell 学院有一篇关于此的文章:

Reflecting values to types and back

见最后标题为 Dynamically constructing type-class instances 的部分和 But what about manual dictionaries?

关于haskell - 我可以将类型类字典显式传递给函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com