0

これが私が理解しようとしているHaskellプログラムのスニペットです:

englishToFrench =  [("the", "le"),("savage", "violent"),("work", "travail"),
         ("wild", "sauvage"),("chance", "occasion"),]

data Entry = Entry {word       :: String,
                    definition :: String,
                    length'    :: Int}
             deriving Show

listOfEntries = map (\(x, y) -> Entry x y (length x)) englishToFrench

簡単に言うと、プログラムはStringタプルのリストを取得し、Entryオブジェクトのリストを作成します。

ただし、のラムダ関数は好きではないので、mapそれを置き換える通常の関数を作成したいと思います。

これを試みましたが、xとyがスコープにないというエラーが発生します。

entryBuilder x y = Entry x y (length x)

entries = map (entryBuilder x y) englishToFrench

ラムダ関数を変換する方法と一般的な方法を教えてもらえますか?

4

1 に答える 1

5

まず、entryBuilder関数のタイプが間違っています。そのはず:

entryBuilder :: (String, String) -> Entry
entryBuilder (x, y) = Entry x y (length x)

あなたのタイプがある間

String -> String -> Entry

タイプmap

map :: (a -> b) -> ([a] -> [b])

リストタイプは[(String、String)]なので、タイプの関数が必要です

(String, String) -> b

に渡すmap

これはあなたのentryBuilder機能なので、あなたはただ使うことができます

listOfEntries = map entryBuilder englishToFrench

entryBuilder使用の既存の定義を使用できることに注意してくださいuncurry

entryBuilder :: String -> String -> Entry

listOfEntries = map (uncurry entryBuilder) englishToFrench

uncurryタイプがあります

uncurry :: (a -> b -> c) -> ((a, b) -> c)

つまり、2つの引数のカリー化された関数を1つのペアの引数を持つ関数に変換します。既存のentryBuilder関数にはタイプがあるので

String -> String -> Entry

uncurry entryBuilderタイプがあります

(String, String) -> Entry

これは、に渡す必要のある関数型ですmap

于 2013-03-13T22:33:02.457 に答える