首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Fay newtype派生Monad以便启用do表示法

从Fay newtype派生Monad以便启用do表示法
EN

Stack Overflow用户
提问于 2014-11-18 15:56:19
回答 1查看 30关注 0票数 0

我想要创建一个不同类别的副作用函数,这样我就可以将一些副作用标记为比其他副作用更安全。

我想在Fay副作用单体上创建一个新类型,并在do表示法中使用它,所以我如下所示:

代码语言:javascript
复制
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PackageImports #-}
import "base" Control.Monad
newtype ReadFay a = ReadFay { readFay :: Fay a } deriving Monad

A这一点,编译器找不到base包。在费伊有可能做到这一点吗?

我仍然可以为>>=return等创建自己的ReadFay版本,但是能够在do符号中使用它就更好了。

或者,有没有更好的方法,如何创造一个不同类别的副作用比我的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 11:59:38

看来我需要让

代码语言:javascript
复制
{-# LANGUAGE RebindableSyntax #-}

若要重写函数,do符号正在调用该函数。然后,我需要在我计划在do表示法中使用的函数中实现新类型的包装和展开包装,并对Prelude标记进行阴影:

代码语言:javascript
复制
myFayReturn :: a -> ReadFay a
myFayReturn x = ReadFay $ return x

myFayBind :: ReadFay a -> (a -> ReadFay b) -> ReadFay b
myFayBind = \a b -> ReadFay $ runReadFay a >>= (runReadFay . b)

newtype ReadFay a = ReadFay { runReadFay :: Fay a }

doNotation :: ReadFay ()
doNotation = let
    x >>= y = myFayBind x y
    return = myFayReturn
    in do
        u <- ReadFay $ putStrLn "A"
        return ()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26998475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档