gpt4 book ai didi

haskell - 定义类型类时类型变量不在范围内

转载 作者:行者123 更新时间:2023-12-02 17:52:18 25 4
gpt4 key购买 nike

我正在编写一个类型类,类似于 mtl 风格的转换器。看起来像这样:

class (Monad m, Stream s m t) => MonadStuff s m | m -> s where
-- function signatures go here…

我试图说 m 应该是 Monad 的实例,并且在那里应该是 Stream s m t 的实例,其中 t 并不重要,但是sm 来自定义的右侧(在 => 之后)。

haskell 说:

Not in scope: type variable ‘t’

所以,显然我不能这样做。或者我可以吗?我应该删除 Stream s m t约束并将其添加到类中的每个函数中,或者存在另一种方式?

最佳答案

如果确实 t 是什么并不重要,那么也许您可以要求编写实例的人选择它:

{-# LANGUAGE TypeFamilies #-}
class (Monad m, Stream s m (StuffType m)) => MonadStuff s m | m -> s where
type StuffType m

或者,由于您已经打开了 MPTC 和fundeps,您可以考虑这样做,这不需要额外的扩展,但在其他方面基本相同:

class (Monad m, Stream s m t) => MonadStuff s m t | m -> s t where

但是,我怀疑事实上t的选择确实很重要:除非Stream有一个至少具有同样信息量的fundep作为 ms -> t,您将无法以有意义的方式使用此约束。在这种情况下,您应该将约束移至提及 t 或将使用 Stream 方法的方法的签名中。

关于haskell - 定义类型类时类型变量不在范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630309/

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