Haskell 中的函数组合问题

Problems wirh function composition in Haskell

所以...我写这个是为了从用户那里得到 5 个矩形:

rectangles <- sequence . take 5 . cycle [getRect]

但是没用。然后我将其重构为 shorthand 用于编写大括号:

rectangles <- sequence $ take 5 $ cycle [getRect]

我不确定为什么我的函数组合无效。如果我要将它翻译成 "real world" 函数,我希望它能像这样工作,不是吗? :

sequence(take(5 , cycle(getRect)))

[编辑]

我知道 (.) 用于函数组合,$ 用于应用程序,但我的组合应该 return 起作用,而不是将 [getRect] 应用于它。不应该吗?

我是从纯数学的角度来看这个问题的。比方说

cycle : a -> b
take 5 : b -> c  -- partially applied
sequence : c -> d

那为什么我的作文不起作用?它应该是一个带有参数 [getRect] 的函数,如下所示:

(sequence . take 5 . cycle)([getRect]) : a -> d

其中 a 是 [getRect],d 是 IO 操作的结果。

函数应用程序绑定比 (.) 更紧密,所以

sequence . take 5 . cycle [getRect]

相同
sequence . take 5 . (cycle [getRect])

因为 cycle [getRect] 是列表而不是函数,所以你得到了错误。

您可以使用括号来获得您想要的优先级:

rectangles <- (sequence . take 5 . cycle) [getRect]

请注意,您可以改用 replicateM

rectangles <- replicateM 5 getRect