当前位置:  开发笔记 > 编程语言 > 正文

Haskell函数应用程序

如何解决《Haskell函数应用程序》经验,为你挑选了2个好方法。

有点新手问题,但我在Haskell的教程示例中遇到了这个例子.对于"查找列表的最后一个元素",有一些明显的版本,比如

last' [x] = x
last' (_:xs) = last' xs

但我无法理解所提出的替代版本:

myLast' = foldr1 (const id)

所以,在尝试理解id函数的应用程序正在做什么时,我尝试了ghci:

const id 1 2 -> gives 2

这绑定如下:

(const id) 1 2 -> gives 2

而不是这样的:

 const (id 1) 2 -> gives 1 

但我没理解这一点.(const id)应该翻译成类似的东西

`(\x y->x) (\x->x)` 

这不应该返回一个只返回其第一个元素的id的函数吗?或者,函数顺序(const id)与const的行为有何不同?



1> Chris Conway..:

定义const

const x = \_ -> x

因此,(const id)是一个函数,它接受一个参数并始终返回id

const id 1 2 = (\_ -> id) 1 2
             = id 2
             = 2

定义foldr1

foldr1 f [x] = x
foldr1 f (x:xs) = f x (foldr1 f xs)

如果我们有

myLast' = foldr1 (const id)

然后

myLast' [x] = foldr1 (const id) [x]
              {- definition of foldr1 -}
            = x

myLast' (x:xs) = foldr1 (const id) (x:xs)
                 {- definition of foldr1 -}
               = (const id) x (foldr1 (const id) xs)
                 {- definition of const -}  
               = (\_ -> id) x (foldr1 (const id) xs)
                 {- function application -}  
               = id (foldr1 (const id) xs)
                 {- definition of id -}  
               = foldr1 (const id) xs
                 {- definition of myLast' -}  
               = myLast' xs

这与...的定义一致last'.


我不会说这是惯用的...... Haskell极客喜欢在如何以"无点"风格表达事物,或纯粹以折叠方式表达事物.它成为一种编程难题.第一个版本更清晰.

2> Magnus..:

:t在尝试理解Haskell时,我非常依赖.在这种情况下:

Prelude> :t const id
const id :: b -> a -> a

可能会帮助你了解发生了什么.


为了澄清,":t"是一个可以在GHCI中用来打印表达式类型的命令.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有