-3

Haskellでプログラミングする方法を学んでいます。

私が見たいのは、マップを使用し、リスト内包表記を使用しない再帰を使用し、マップやその他の高次ライブラリ関数を使用せずに、リストの各要素に 1 を追加することです。

両方の実装方法を見るのはかなりクールだと思いました。

4

2 に答える 2

9

何をするのかを理解すればmap、あなたが意図していることを書くことは難しくないと思います。の種類を見ると、map

*Main> :t map
map :: (a -> b) -> [a] -> [b]

したがって、関数とリストを取り、その関数をリストの各要素に適用した後、別のリストを返します。したがって、各要素に1つ追加するという意図した目的のために、関数を選択できます(+1)。そう

*Main> map (+1) [3,4,5,1,2]
[4,5,6,2,3]

基本的な haskell を理解していれば、独自の関数を簡単に定義できます。ヘルプのソースを見ることができますmap

map _ []     = []
map f (x:xs) = f x : map f xs

次のような再帰インクリメント関数を実装するために必要なすべてのヘルプを提供します

add' [] = []
add' (x:xs) = (x+1) : add' xs

これをghciで試してください

*Main> add' [3,4,5,1,2]
[4,5,6,2,3]
于 2013-02-01T04:19:48.173 に答える
3

等式推論

Satvik は再帰バージョンをうまく説明しましたが、リスト内包バージョンには非常に興味深いものがあります。見てみましょう。

add1 xs = [x + 1 | x <- xs]

リスト内包表記は Python と非常によく似た構文を持っていますが、実際には、通常の言語構造の構文シュガーにすぎません ---do表記法です!

add1 xs = do x <- xs
             return (x + 1)

リストモナドを操作しているだけなので、do表記法を脱糖できます

add1 xs = xs >>= \x -> return (x + 1)

次に、いくつかの変換を適用します

add1 xs = xs >>= return . (+1)
        = liftM (+1) xs
        = fmap  (+1) xs
        =  map  (+1) xs

そして、私たちは始めたところに戻ってきました。

于 2013-02-01T23:46:35.163 に答える