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

简而言之,该程序获取一个字符串元组列表并生成一个条目对象列表。

但是,我不喜欢 lambda 函数,map我想创建一个常规函数来替换它。

我尝试了这个,但它给了我一个错误,即 x 和 y 不在范围内:

entryBuilder x y = Entry x y (length x)

entries = map (entryBuilder x y) englishToFrench

谁能告诉我如何转换 lambda 函数以及一般方法是什么?

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

请注意,您可以使用现有的entryBuilderusing定义uncurry

entryBuilder :: String -> String -> Entry

listOfEntries = map (uncurry entryBuilder) englishToFrench

uncurry有类型

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

即它将两个参数中的柯里化函数转换为具有单个对参数的函数。由于您现有的entryBuilder功能具有类型

String -> String -> Entry

uncurry entryBuilder有类型

(String, String) -> Entry

这是您需要传递给的函数类型map

于 2013-03-13T22:33:02.457 回答