List 理解一元函数组合

List 理解一元函数组合,list,haskell,monads,function-composition,kleisli,List,Haskell,Monads,Function Composition,Kleisli,我从《给你学哈斯卡尔好东西》一书中了解到了单子米兰·利波瓦卡。我试图理解单子的结合定律。从本质上说,法律规定,当你有一系列>>=的一元函数应用程序时,它们的嵌套方式并不重要 以下代码允许将a->m b类型函数的结果传递给b->m c类型函数: 但是,对于以下示例: 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]

我从《给你学哈斯卡尔好东西》一书中了解到了单子米兰·利波瓦卡。我试图理解单子的结合定律。从本质上说,法律规定,当你有一系列>>=的一元函数应用程序时,它们的嵌套方式并不重要

以下代码允许将a->m b类型函数的结果传递给b->m c类型函数:

但是,对于以下示例:

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]
fx和gx都是函数吗?似乎它们是具有不同x值的列表,而不是函数。这条线怎么让h=f 这是普通的函数定义语法。我们定义了一个新的函数f,通过写下它在应用于假设值x时会产生什么

let无论是作为声明还是let。。。在里面表达式只是引入了一个块,您可以在其中进行定义,非常类似于where。这些定义本身使用与全局定义相同的语法

如果您知道如何通过在文件中写入例如plusOne n=n+1来定义函数,那么如果您不知道如何定义函数,那么这种语法完全相同,那么我建议您在尝试理解一元函数组合之前,先阅读一些关于基本Haskell语法的入门教程

在这些定义之后,f和g是函数。fx和gx没有真正意义,因为在范围内没有x可以应用它们

如果在作用域中确实有这样一个值,那么fx将是一个计算结果为列表的表达式,这涉及调用函数f。说fx或gx是函数仍然是不正确的

现在应该很清楚,让h=f 这是普通的函数定义语法。我们定义了一个新的函数f,通过写下它在应用于假设值x时会产生什么

let无论是作为声明还是let。。。在里面表达式只是引入了一个块,您可以在其中进行定义,非常类似于where。这些定义本身使用与全局定义相同的语法

如果您知道如何通过在文件中写入例如plusOne n=n+1来定义函数,那么如果您不知道如何定义函数,那么这种语法完全相同,那么我建议您在尝试理解一元函数组合之前,先阅读一些关于基本Haskell语法的入门教程

在这些定义之后,f和g是函数。fx和gx没有真正意义,因为在范围内没有x可以应用它们

如果在作用域中确实有这样一个值,那么fx将是一个计算结果为列表的表达式,这涉及调用函数f。说fx或gx是函数仍然是不正确的


所以现在应该很清楚,让h=f没有什么比在一张纸上手工理解定义更好的了

fx=[x,-x]也可以写成f=\x->[x,-x]。因此


编辑图片,并对这些Kleisli箭头及其可组合性进行更多讨论,请参见。

没有什么比在一张纸上手工完成定义更能让人理解的了

fx=[x,-x]也可以写成f=\x->[x,-x]。因此

编辑图片,并进一步讨论这些Kleisli箭头及其可组合性,请参阅。

f和g是函数。fx和gx是假设范围内有变量x的列表;否则它们是错误。f和g是函数。fx和gx是假设范围内有变量x的列表;否则就是错误。
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 = [x, -x]
  h 3 
= {- by def of h -}
  (f <=< g) 3 
= {- by def of (<=<) -}
  (\x -> g                   x >>= f               ) 3
= {- by defs of f and g -}
  (\x -> (\ x -> [x*3, x*2]) x >>= (\ x -> [x, -x])) 3
= {- by substitution -}
         (\ x -> [x*3, x*2]) 3 >>= (\ x -> [x, -x])
= {- by substitution -}
                 [3*3, 
                  3*2]         >>= (\ x -> [x, -x])
= {- by definition of (>>=) for [] -}
  concat [       (3*3)         &   (\ x -> [x, -x])  -- x & f == f x
         ,       (3*2)         &   (\ x -> [x, -x]) 
         ]
= {- by definition of concat -}
                 (3*3)         &   (\ x -> [x, -x])
         ++      (3*2)         &   (\ x -> [x, -x]) 
= 
  [9, -9, 6, -6]