【发布时间】:2019-08-05 04:46:43
【问题描述】:
我正在从“Learn You a Haskell for Great Good!”一书中学习 monad。米兰利波卡。我试图了解单子的结合律。从本质上讲,法律规定,当您拥有带有>>= 的一元函数应用程序链时,它们的嵌套方式无关紧要。
以下代码可以将a -> m b 类型的函数的结果传递给b -> m c 类型的函数:
(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)
f <=< g = (\x -> g x >>= f)
但是,对于下面的示例:
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]
f x 和 g x 都是函数吗?似乎它们是具有不同 x 值而不是函数的列表。 let h = f <=< g 行在上面的代码中是如何工作的? f 和 g 必须是函数,因为它们与 <=< 一起使用,但我不确定它们是什么。
【问题讨论】:
-
f和g是函数。f x和g x是列表(假设范围内有变量x;否则它们是错误)。
标签: list haskell monads function-composition kleisli