为什么定义MonadReader需要FunctionalDependency? [英] Why is FunctionalDependency needed for defining MonadReader?

查看:18
本文介绍了为什么定义MonadReader需要FunctionalDependency?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚理解了类的定义MonadReader

class Monad m => MonadReader r m | m -> r where
...

阅读了Haskell中的函数依赖文档,现在我可以理解| m -> r指定类型变量rm唯一决定。根据我目前所见的几个典型的MonadReader实例(例如Reader),我认为这个要求是合理的,但在我看来,即使没有这个函数依赖子句,我们仍然可以定义像Reader这样的实例。

我的问题是,为什么在MonadReader的定义中需要函数依赖?对于定义MonadReader来说,这在功能上是必要的,因为如果没有它,MonadReader就无法正确定义,或者它只是一个限制,以限制MonadReader的使用方式,以便MonadReader的实例都以某种预期的方式运行?

推荐答案

需要以更方便用户的方式进行类型推理。

例如,如果没有函数,这将无法编译:

action :: ReaderT Int IO ()
action = do
  x <- ask
  liftIO $ print x

要编译上述代码,我们需要编写

action :: ReadertT Int IO ()
action = do
  x <- ask :: ReadertT Int IO Int
  liftIO $ print x

这是因为,没有函数,编译器无法推断xInt。毕竟,一个单体ReadertT Int IO可能有多个实例

instance MonadReader Int (ReaderT Int IO) where
   ask = ReaderT (i -> return i)
instance MonadReader Bool (ReaderT Int IO) where
   ask = ReaderT (i -> return (i != 0))
instance MonadReader String (ReaderT Int IO) where
   ask = ReaderT (i -> return (show i))
-- etc.

因此程序员必须提供一些强制x :: Int的注释,否则代码不明确。

这篇关于为什么定义MonadReader需要FunctionalDependency?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆