gpt4 book ai didi

haskell - Haskell中 "reusing"参数的技巧?

转载 作者:行者123 更新时间:2023-12-03 11:46:55 27 4
gpt4 key购买 nike

有时我会偶然发现我想表达“请使用最后一个参数两次”的问题,例如为了编写无点样式或避免使用 lambda。例如。

sqr x = x * x

可以写成
sqr = doubleArgs (*) where
doubleArgs f x = f x x

或者考虑这个稍微复杂一点的函数(取自 this question):
ins x xs = zipWith (\ a b -> a ++ (x:b)) (inits xs) (tails xs)

如果有这样的函数,我可以无点编写这段代码:
ins x = dup (zipWith (\ a b -> a ++ (x:b))) inits tails where
dup f f1 f2 x = f (f1 x) (f2 x)

但是因为我在 Hoogle 中找不到类似 doubleArgs 或 dup 的东西,所以我想我可能会在这里错过一个技巧或成语。

最佳答案

来自 Control.Monad :

join :: (Monad m) -> m (m a) -> m a
join m = m >>= id

instance Monad ((->) r) where
return = const
m >>= f = \x -> f (m x) x

扩展:
join :: (a -> a -> b) -> (a -> b)
join f = f >>= id
= \x -> id (f x) x
= \x -> f x x

所以,是的, Control.Monad.join .

哦,对于您的无点示例,您是否尝试过使用应用符号(来自 Control.Applicative ):
ins x = zipWith (\a b -> a ++ (x:b)) <$> inits <*> tails

(我也不知道为什么人们如此喜欢 a ++ (x:b) 而不是 a ++ [x] ++ b ...它并没有更快 - 内联会处理它 - 后者更加对称!哦,好吧)

关于haskell - Haskell中 "reusing"参数的技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4333864/

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