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

时间:2013-09-04 04:16:30

标签: haskell

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

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

我可以使用“。”像这样:

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

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

(take . (repeat " ")) 2 两者都不起作用?

有人帮忙吗?

4 个答案:

答案 0 :(得分:10)

take 2 $ repeat " " 

take 2 . repeat $ " "

take 2 . cycle $ [" "]

但你真正想要的是:

replicate 2 " "

由上面要求的内容包括拍摄和重复拍摄。

replicate :: Int -> a -> [a]
replicate n x = take n $ repeat x

答案 1 :(得分:7)

你想要的是

 take 2 . repeat $ " "

.组成了函数。所以我们在这里撰写take 2repeat。转换更大的东西:

a b c (d e f (g h i))
a b c . d e f. g h $ i

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

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

答案 2 :(得分:2)

好的,(take 2 . repeat) " "这有效。

答案 3 :(得分:1)

您似乎想要使用(.),并且已经发布了要做的方法,但如果您只想删除括号,那么take 2 $ repeat " "可以正常工作。 ($)运算符允许您通过用($)替换随附的打开paren来删除最终结束表。