我怎样才能让 Haskell 知道我不关心泛型的类型是什么?
How can I let Haskell know I don't care what a generic's type is?
我正在编写应用程序内部的一些代码,并希望将其设为通用 w.r.t。它使用的一些类型,所以我可以模拟单元测试的类型。
我正在尝试按照以下方式设置类型-class:
class (Monad m) => SomeClass m a x d | m -> a where
makeState :: x -> m (a x)
open :: (a x) -> m (a d)
use :: OtherArg -> (a d) -> m ()
close :: (a d) -> m ()
其中 m
类型变量将是一个 monad(例如 IO
、ST
),a
将是 monad 中的某种包装类型(例如 MVar
、STRef
) 和 x
将在编译时已知,但我不关心使用 type-[ 的函数中 d
的类型=41=],只是在类型-class实例函数实现本身。
现在我只是想设置我的类型,当我将约束添加到我的函数时它出错了,例如:
someFn :: (SomeClass m a Model d) => a d -> a Model -> T m ()
编译器抱怨 d
不明确,如果不具体指定类型就不会让我离开,这意味着我将无法模拟它。
我简要地看了一些语言扩展,似乎 RankNTypes
可能是我需要的,但我不确定如何使用它。
这是完成我想要做的事情的正确方法,还是我应该采用不同的方法? (如果我太 OOPily 接近它,我不会感到惊讶,因为我最近一直在 Java 工作。)
提前致谢。
也许这足以让基金会发疯:
class (Monad m) => SomeClass m a x d | m -> a <b>d</b> 其中
我正在编写应用程序内部的一些代码,并希望将其设为通用 w.r.t。它使用的一些类型,所以我可以模拟单元测试的类型。
我正在尝试按照以下方式设置类型-class:
class (Monad m) => SomeClass m a x d | m -> a where
makeState :: x -> m (a x)
open :: (a x) -> m (a d)
use :: OtherArg -> (a d) -> m ()
close :: (a d) -> m ()
其中 m
类型变量将是一个 monad(例如 IO
、ST
),a
将是 monad 中的某种包装类型(例如 MVar
、STRef
) 和 x
将在编译时已知,但我不关心使用 type-[ 的函数中 d
的类型=41=],只是在类型-class实例函数实现本身。
现在我只是想设置我的类型,当我将约束添加到我的函数时它出错了,例如:
someFn :: (SomeClass m a Model d) => a d -> a Model -> T m ()
编译器抱怨 d
不明确,如果不具体指定类型就不会让我离开,这意味着我将无法模拟它。
我简要地看了一些语言扩展,似乎 RankNTypes
可能是我需要的,但我不确定如何使用它。
这是完成我想要做的事情的正确方法,还是我应该采用不同的方法? (如果我太 OOPily 接近它,我不会感到惊讶,因为我最近一直在 Java 工作。)
提前致谢。
也许这足以让基金会发疯:
class (Monad m) => SomeClass m a x d | m -> a <b>d</b> 其中