试图理解点运算符

时间:2016-04-17 07:02:43

标签: haskell

我试图了解点运算符的工作原理。这是一个例子:

main = do
    ns <- getNetworkInterfaces
    mapM_ (putStr . showInterface) ns

我知道mapM_接受一个函数Monad。 &#34; NS&#34;是Monad。但是在这个特定的例子中,部分(putStr . showInterface)实际上如何根据Haskell语法或语法起作用?再次:在这个特定的例子中。另外,首先调用哪个函数:putStr或showInterface?

1 个答案:

答案 0 :(得分:4)

它只是构图 - 它一个接一个地(从右边) - 所以

(putStr . showInterface) n

只是

putStr (showInterface n)

所以从某种意义上说,showInterface首先被称为

请注意,您的理解在这里有点缺陷 - ns不是重要的monad(这是一个列表 - 它是Foldable的较新版本中的mapM_部分 - 重要的monad是IOmapM_接受一个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 ~ IOa ~ SomeInterfaceType - 注意 monad b ~ ()! - 你得到:

IO