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
所以...我写这个是为了从用户那里得到 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