这是我写的:
(take 2 (repeat " "))
我想在没有括号的情况下将其更改为expr。
我可以使用“。”像这样:
ceiling (negate (tan (cos (max 50 x))))
可以更改为
ceiling . negate . tan . cos . max 50
但我尝试了(take 2) . (repeat " ")
和(take . (repeat " ")) 2
两者都不起作用?
有人帮忙吗?
答案 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 2
和repeat
。转换更大的东西:
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来删除最终结束表。