如何使用Haskell中的组合用括号更改函数调用?

yeh*_*ehe 1 haskell

这是我写的: (take 2 (repeat " "))

我想在没有括号的情况下将其更改为expr.

我可以用吗 "." 像这样:

ceiling (negate (tan (cos (max 50 x)))) 可以改为 ceiling . negate . tan . cos . max 50

但我试过了 (take 2) . (repeat " ")

(take . (repeat " ")) 2 这两个不工作?

有人帮忙吗?

The*_*net 10

take 2 $ repeat " " 
Run Code Online (Sandbox Code Playgroud)

要么

take 2 . repeat $ " "
Run Code Online (Sandbox Code Playgroud)

要么

take 2 . cycle $ [" "]
Run Code Online (Sandbox Code Playgroud)

但你真正想要的是:

replicate 2 " "
Run Code Online (Sandbox Code Playgroud)

如上所述,其中包括take和repeat.

replicate :: Int -> a -> [a]
replicate n x = take n $ repeat x
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句:如果OP在他/她的代码上尝试了hlint,那么它也会建议复制...... (2认同)

Dan*_*zer 7

你想要的是什么

 take 2 . repeat $ " "
Run Code Online (Sandbox Code Playgroud)

.组成功能.所以我们在这里撰写take 2repeat.要转换更大的东西:

a b c (d e f (g h i))
a b c . d e f. g h $ i
Run Code Online (Sandbox Code Playgroud)

你组成了最内部函数的所有函数和部分应用(这里g h i)以及除了它的最后一个参数之外的所有函数.这会从最后一个参数到最终结果创建一个很大的函数.

然后我们应用此函数,$以便优先级正确.正如您所发现的,因为$只是具有不同优先级的应用程序,您可以只使用parens进行分组.但我个人更喜欢$.