1

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

我想将其更改为不带括号的 expr。

我可以用吗 ”。” 像这样:

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

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

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

有人帮忙吗?

4

4 回答 4

10
take 2 $ repeat " " 

或者

take 2 . repeat $ " "

或者

take 2 . cycle $ [" "]

但你真正想要的是:

replicate 2 " "

正如您在上面所要求的,这包括拍摄和重复。

replicate :: Int -> a -> [a]
replicate n x = take n $ repeat x
于 2013-09-04T06:06:41.467 回答
7

你想要的是

 take 2 . repeat $ " "

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

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

您组合了所有函数和最内层函数的部分应用(此处g h i)以及除最后一个参数之外的所有函数。这将创建一个从最后一个参数到最终结果的大函数。

然后我们应用这个函数,$以便优先级是正确的。正如您所发现的,由于$只是具有不同优先级的应用程序,您可以只用括号分组。但我个人更喜欢$.

于 2013-09-04T04:18:07.930 回答
2

好的,(take 2 . repeat) " "这行得通。

于 2013-09-04T04:17:57.133 回答
1

您似乎想使用(.),并且已经发布了这样做的方法,但是如果您只想删除括号,那么就take 2 $ repeat " "可以了。($)运算符允许您通过将随附的开放括号替换为($).

于 2013-09-04T07:00:26.160 回答