gpt4 book ai didi

haskell - 理解这个任务?

转载 作者:行者123 更新时间:2023-12-04 05:05:51 24 4
gpt4 key购买 nike

为了刷新我 20 年使用 Haskell 的经验,我正在浏览 https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Adding_Variables_and_Assignment并且在某一时刻引入了以下行来应用 op到所有参数。这是为了实现例如(+ 1 2 3 4)

numericBinop op params = mapM unpackNum params >>= return . Number . foldl1 op

语法我看不懂,文中的解释有点含糊。

我明白了 foldl1做以及如何点函数( unpackNum 是一个辅助函数),但是使用 Monads 和 >>=运营商让我有点困惑。

这要怎么读?

最佳答案

本质上,

mapM unpackNum params >>= return . Number . foldl1 op

由两部分组成。
mapM unpackNum params表示:取参数列表 params .在每个项目上,应用 unpackNum : 这将产生 Integer包裹在 ThrowsError单子(monad)。所以,这不是一个简单的 Integer ,因为它有机会出错。无论如何,使用 unpackNum在每个项目上成功生成所有 Integers ,或抛出一些错误。在第一种情况下,我们生成一个类型为 [Integer] 的新列表。 ,在第二个中,我们(不出所料)抛出错误。因此,这部分的结果类型是 ThrowsError [Integer] .

第二部分是 ... >>= return . Number . foldl1 op .这里 >>=意思是:如果第一部分抛出了一些错误,那么整个表达式也会抛出那个错误。如果零件成功生产 [Integer]然后继续 foldl1 op , 将结果包装为 Number , 最后使用 return将此值作为成功计算注入(inject)。

总的来说,有单子(monad)计算,但你不应该考虑太多。这里的 monadic 东西只是传播错误,或者如果计算成功则存储纯值。有了一点经验,就可以只专注于成功的值(value)观,让 mapM,>>=,return处理错误情况。

顺便提一下,虽然本书使用了像 action >>= return . f 这样的代码。 ,这可以说是一种糟糕的风格。可以使用 fmap f action 达到同样的效果或 f <$> action ,这是表达相同计算的更直接的方式。例如。
Number . foldl1 op <$> mapM unpackNum params

这非常接近忽略错误情况的非单子(monad)代码
-- this would work if there was no monad around, and errors did not have to be handled
Number . foldl1 op $ map unpackNum params

关于haskell - 理解这个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825923/

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