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

Cod*_*ein 0 lambda haskell function

这是我想要了解的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
Run Code Online (Sandbox Code Playgroud)

简而言之,该程序获取一个String元组列表,并生成一个Entry对象列表.

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

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

entryBuilder x y = Entry x y (length x)

entries = map (entryBuilder x y) englishToFrench
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何转换lambda函数和一般方法是什么?

Lee*_*Lee 5

首先,您的entryBuilder函数类型错误.它应该是:

entryBuilder :: (String, String) -> Entry
entryBuilder (x, y) = Entry x y (length x)
Run Code Online (Sandbox Code Playgroud)

而你的类型

String -> String -> Entry
Run Code Online (Sandbox Code Playgroud)

的类型map

map :: (a -> b) -> ([a] -> [b])
Run Code Online (Sandbox Code Playgroud)

因为你的列表类型是[(String,String)],你想要一个类型的函数

(String, String) -> b
Run Code Online (Sandbox Code Playgroud)

传递给map.

这是你的entryBuilder功能,所以你可以使用

listOfEntries = map entryBuilder englishToFrench
Run Code Online (Sandbox Code Playgroud)

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

entryBuilder :: String -> String -> Entry

listOfEntries = map (uncurry entryBuilder) englishToFrench
Run Code Online (Sandbox Code Playgroud)

uncurry 有类型

uncurry :: (a -> b -> c) -> ((a, b) -> c)
Run Code Online (Sandbox Code Playgroud)

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

String -> String -> Entry
Run Code Online (Sandbox Code Playgroud)

uncurry entryBuilder 有类型

(String, String) -> Entry
Run Code Online (Sandbox Code Playgroud)

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