我试图了解点运算符的工作原理。这是一个例子:
main = do
ns <- getNetworkInterfaces
mapM_ (putStr . showInterface) ns
我知道mapM_
接受一个函数Monad
。 &#34; NS&#34;是Monad
。但是在这个特定的例子中,部分(putStr . showInterface)
实际上如何根据Haskell语法或语法起作用?再次:在这个特定的例子中。另外,首先调用哪个函数:putStr或showInterface?
答案 0 :(得分:4)
它只是构图 - 它一个接一个地(从右边) - 所以
(putStr . showInterface) n
只是
putStr (showInterface n)
所以从某种意义上说,showInterface
首先被称为
请注意,您的理解在这里有点缺陷 - ns
不是重要的monad(这是一个列表 - 它是Foldable
的较新版本中的mapM_
部分 - 重要的monad是IO
和mapM_
接受一个monadic动作和一系列要放入该动作的事物(逐个) - 所以这里ns
中的每个项目都被放入行动
putStr . showInterface
当然每个都将首先用于纯函数showInterface
(显然会生成一个字符串),然后使用{{1}打印到stdout
(此是需要 putStr
)的一元行动
如果您想知道事项哪个部分,请查看签名
如果mapM_
是:
mapM_
忘了这里的mapM_ :: (Monad m, Foldable t) => (a -> m b) -> t a -> m ()
- 这是你的清单:
Foldable t
现在mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
可以是什么?
你使用m
作为第一个参数 - 现在我不确切知道putStr . showInterface
是什么 - 但是当你用showInterface
组成时,结果类型应该是< / p>
putStr
现在你应该看到:putStr . showInterface :: SomeInterfaceType -> IO ()
,m ~ IO
和a ~ SomeInterfaceType
- 注意 monad 是b ~ ()
! - 你得到:
IO