cen*_*980 1 monads haskell list function-composition kleisli
我正在从“学习Haskell为伟大!”一书中学习单子。由Miran Lipovaca撰写。我试图理解单子的结合律。本质上,法律规定,当您使用拥有一元函数应用程序链时>>=,如何嵌套它们无关紧要。
以下代码使人们能够将type函数的结果传递给type a -> m b函数b -> m c:
(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)
f <=< g = (\x -> g x >>= f)
Run Code Online (Sandbox Code Playgroud)
但是,对于以下示例:
ghci> let f x = [x, -x]
ghci> let g x = [x*3, x*2]
ghci> let h = f <=< g
ghci> h 3
[9, -9, 6, -6]
Run Code Online (Sandbox Code Playgroud)
是f x和g x两个功能?看来它们是具有不同x值而不是函数的列表。该行在let h = f <=< g上面的代码中如何工作?f并且g必须是函数,因为它们已经被使用了,<=<但是我不确定它们是什么。
f x = [x, -x]
Run Code Online (Sandbox Code Playgroud)
这是普通的函数定义语法。我们通过记下应用于假设值时会产生的内容来定义一个新函数。fx
let(无论是语句还是let ... in ...表达式)都只是引入了一个块,您可以在其中进行定义,就像where。定义本身使用与全局定义相同的语法。
如果您知道如何通过例如plusOne n = n + 1在文件中编写函数来定义函数,那么此语法是完全相同的(如果您不知道如何执行此操作,那么我建议您在尝试之前先通读一些基本的Haskell语法入门教程)了解单调功能的组成)。
因此,在这些定义f和g函数之后。f x而且g x没有任何意义,因为您没有x适用范围。
如果您的作用域中确实有这样的值,那么f x它将是一个计算为列表的表达式,其中涉及调用该函数f。它仍然不会是真正的说,f x或者g x是功能。
因此,现在应该清楚的let h = f <=< g是,h通过将<=<运算符应用于f和来定义新值g。