21

少し初心者の Haskell の質問ですが、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 とはどのように異なる動作をしますか?

4

2 に答える 2

31

の定義const

const x = \_ -> x

したがって、(const id)は 1 つの引数を取り、常に戻り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'

于 2008-12-05T06:16:06.750 に答える
9

:tHaskell を理解しようとするとき、私は大いに依存しています。この場合:

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

何が起こっているのかを理解するのに役立ったかもしれません。

于 2008-12-07T20:49:58.497 に答える