gpt4 book ai didi

Haskell 应用习语?

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

我是 Haskell 的新手,对如何以最惯用和最清晰的方式最好地表达一些操作感到困惑。目前(还会有更多)我对 <*> 感到困惑(我什至不知道该怎么称呼它)。

例如,如果我有,说

f = (^2)
g = (+10)

作为代表函数(实际上它们更复杂,但这里的关键是它们是不同的和不同的),那么
concatMap ($ [1,2,3,4,10]) [(f <$>), (g <$>) . tail . reverse] 


concat $ [(f <$>), (g <$>) . tail . reverse] <*> [[1,2,3,4,10]]

完成同样的事情。

是这些更惯用的 Haskell 中的一个,其中一个是否暗示了一个有经验的 Haskell 读者,而另一个则没有。也许还有其他(更好的)方法可以表达完全相同的东西。像我这样的新手 Haskeller 可能缺少的两种方法之间是否存在概念差异?

最佳答案

你的两个函数(f <$>)(g <$>).tail.reverse返回一个幺半群类型(在本例中为列表),以便您可以使用 mconcat将它们转换为单个函数。然后您可以将此函数直接应用于输入列表,而不是将其包装在另一个列表中并使用 concatMap :

mconcat [(f <$>), (g <$>).tail.reverse] $ [1,2,3,4,10]

为了对此进行扩展,函数 a -> bMonoid 的一个实例如果 b是一个幺半群。 implementationmappend对于这样的功能是:
mappend f g x = f x `mappend` g x

或等效地
mappend f g = \x -> (f x) `mappend` (g x)

所以给定两个函数 fg返回一个幺半群类型 b , f映射 g返回一个将其参数应用于 f 的函数和 g并使用 Monoid 组合结果 b 的实例.
mconcat有类型 Monoid a => [a] -> a并使用 mappend 组合输入列表的所有元素.

列表是幺半群,其中 mappend == (++)所以
mconcat [(f <$>), (g <$>).tail.reverse]

返回一个类似的函数
\x -> (fmap f x) ++ (((fmap g) . tail . reverse) x)

关于Haskell 应用习语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481724/

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