什么是哈斯克尔的lambda单位?

dim*_*mid 2 lambda haskell

我是一个haskell初学者,并试图理解基于StateMonad的计数器的这个定义.我知道lambda通常有变量,例如

(\n -> n + 1)
Run Code Online (Sandbox Code Playgroud)

是一个接受参数的函数,将n其值递增1,然后返回结果.但是,在这种情况下,而不是变量,有一个值,一个空元组(单位).

tick :: StateMonad Int Int
tick = fetch >>= (\n -> store (n + 1) >>= (\() -> return n))
Run Code Online (Sandbox Code Playgroud)

它是从Generalising Monads到Arrows的第5页.

Ale*_*lec 7

从技术上讲,lambda表达式的参数实际上是Haskell中的模式(expHaskell 98报告中查看EBNF的第一种情况).所以我可以编写一个与之\(x,y) -> x + y相同的函数\t -> fst t + snd t.在这种情况下,\() -> return n模式匹配是唯一可能的类型值()- ()本身.


这是明确说明的类比.我可以用同样的方式编写一个函数

f :: Num a => (a,a) -> a
f t = fst t + snd t
Run Code Online (Sandbox Code Playgroud)

我也可以使用模式匹配来编写这个函数

f' :: Num a => (a,a) -> a
f' (x,y) = x + y
Run Code Online (Sandbox Code Playgroud)

同样适用于lambda表达式:我可以写\(x,y) -> x + y.然后,lambda \() -> return n是相同的,除了类型值的模式匹配()是微不足道的:唯一可能的值是().

编辑

如果不清楚,return :: Monad m => a -> m a是将常规函数放入最小的monadic上下文中的常规函数​​,与return许多命令式语言中存在的关键字无关.

  • @DanielWagner` \() - > ...`确实_not_忽略它的参数,与其他两个不同.它评估参数并将其与`()`进行比较.`(\ _ - > 0)undefined`是'0`; `(\() - > 0)undefined`抛出错误. (5认同)
  • 在不使用前一个值的情况下,可以使用`>>`而不是`>> =`.例如`tick = fetch >> = \n - > store(n + 1)>> return n` (2认同)