gpt4 book ai didi

haskell - 从 Haskell do 表示法转换 listDirectory 映射

转载 作者:行者123 更新时间:2023-12-02 07:58:57 26 4
gpt4 key购买 nike

考虑这个 Haskell 脚本,它在目录中的每个路径都附加了一个感叹号:

import System.Directory

mapPaths paths = map (++ "!") paths

transformAll = do
paths <- listDirectory "/"
print $ mapPaths paths

main = transformAll

如何在仍然使用函数 mapPaths 的同时将其转换为从左到右的绑定(bind)操作链原样?

我想了解如何编写一个看起来像这样的函数:
doSomething :: [String] => IO [String]
doSomething paths = ???

transformAll = listDirectory "/" >>= doSomething >>= print

在哪里 doSomething具有此签名并使用 mapPaths .

最佳答案

<-脱糖成 >>=和一个 lambda,像这样:

transformAll = listDirectory "/" >>= \paths -> print $ mapPaths paths

然后你可以像这样编写你想要的函数:
doSomething :: [String] -> IO [String]
doSomething paths = return $ mapPaths paths

顺便说一句,自从 [String]是一个参数类型而不是一个约束,你在它后面使用一个小箭头,而不是一个大箭头。此外,IMO,拥有 doSomething完全只是无缘无故地让事情变得不那么清楚(因为它不需要执行任何 IO 操作,但现在它的类型中有 IO)。你可以写 transformAll = listDirectory "/" >>= print . mapPathstransformAll = listDirectory "/" >>= (mapPaths <&> print)而是避免它(注意后者需要 <&> 中的 Data.Functor )。

关于haskell - 从 Haskell do 表示法转换 listDirectory 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869049/

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