适用于简单IO示例的适用于monadic风格

 warcraft04 发布于 2023-02-13 17:29

这里的两位非常简单的功能fg.

{-# LANGUAGE ScopedTypeVariables #-}

module Test where

import Control.Applicative

f :: IO ()
f = do
    y <- (<*>) (pure (show . (*10))) (read <$> readFile "data")
    writeFile "out" y

g :: IO ()
g = do
    y <- (readFile "data" >>= return . show . (*10) . read)
    writeFile "out" y

读取文件并*10f写入应用性风格pure(<*>).读取和*10输入的文件g是以monadic样式编写的>>=.(我一直在使用刻意避免liftMg强调以下问题).

f和之间的语义差异是g什么?或者在这种情况下,它只是一种风格选择吗?

1 个回答
  • show . (*10) . read 是一个"非monadic"函数 - 我的意思是,它在IO monad中没有做任何事情,正如你可以从它的类型中看到的那样.

    >>= return . 可以缩短为

    `liftM`
    

    `liftM`
    

    应始终相当于

    `fmap`
    

    fmap 既不需要monad类型类也不需要应用类型类,它只需要仿函数类型类.

    现在把注意力转向应用版本,这个:

    (<*>) (pure ...
    

    相当于<$>,这只是fmap.

    因此,在这两种情况下,我们"真的"只是在函数中使用函数操作,在阅读和写作之间,虽然你以稍微不同的方式组合了函数(我们需要应用一个或多个"法则"来翻译这两个函数)相互之间的版本),语义是 - 或应该 - 相同.无论如何,当然他们和IO monad在一起.

    2023-02-13 17:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有