在Haskell中,将Lambda函数转换为常规函数

时间:2013-03-13 22:27:28

标签: function haskell lambda

这是我想要了解的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中的lambda函数,我想创建一个常规函数来替换它。

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

entryBuilder x y = Entry x y (length x)

entries = map (entryBuilder x y) englishToFrench

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

1 个答案:

答案 0 :(得分: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)

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

String -> String -> Entry

uncurry entryBuilder的类型为

(String, String) -> Entry

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