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