这是我想要了解的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函数以及通用方法是什么?
答案 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
所需的函数类型。