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函数和一般方法是什么?
首先,您的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.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |