Function 在Haskell中,将Lambda函数转换为正则函数的过程
下面是我试图理解的Haskell程序的一个片段:Function 在Haskell中,将Lambda函数转换为正则函数的过程,function,haskell,lambda,Function,Haskell,Lambda,下面是我试图理解的Haskell程序的一个片段: englishToFrench = [("the", "le"),("savage", "violent"),("work", "travail"), ("wild", "sauvage"),("chance", "occasion"),] data Entry = Entry {word :: String, definition :: String,
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函数,我想创建一个常规函数来替换它
我试图这样做,但它给我一个错误,x和y不在范围内:
entryBuilder x y = Entry x y (length x)
entries = map (entryBuilder x y) englishToFrench
有谁能告诉我如何转换lambda函数以及一般方法是什么吗?首先,您的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
要传递到映射
这是您的entryBuilder
函数,因此您只需使用
listOfEntries = map entryBuilder englishToFrench
请注意,您可以使用uncurry
使用现有的entryBuilder
定义:
entryBuilder :: String -> String -> Entry
listOfEntries = map (uncurry entryBuilder) englishToFrench
uncurry
具有以下类型
uncurry :: (a -> b -> c) -> ((a, b) -> c)
i、 它将两个参数中的curried函数转换为一个具有单对参数的函数。由于现有的entryBuilder
函数具有
String -> String -> Entry
uncurry entryBuilder
具有类型
(String, String) -> Entry
您需要传递给map
的函数类型首先,您的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
要传递到映射
这是您的entryBuilder
函数,因此您只需使用
listOfEntries = map entryBuilder englishToFrench
请注意,您可以使用uncurry
使用现有的entryBuilder
定义:
entryBuilder :: String -> String -> Entry
listOfEntries = map (uncurry entryBuilder) englishToFrench
uncurry
具有以下类型
uncurry :: (a -> b -> c) -> ((a, b) -> c)
i、 它将两个参数中的curried函数转换为一个具有单对参数的函数。由于现有的entryBuilder
函数具有
String -> String -> Entry
uncurry entryBuilder
具有类型
(String, String) -> Entry
在map的类型定义中,您需要传递给map
的函数类型是什么,您确定[a]->[b]应该放在括号中(它本身就是一个函数??)@Imray(a->b)->([a]->[b])
和(a->b)->[a]->[b]
是相同的,函数箭头是右关联的。@Imray-我已经添加了一个关于uncurry
的解释。至于map
,我认为将其视为将“常规”函数提升到列表之上的函数是有帮助的(即,将函数从a移到b,并将函数从a的列表返回到b的列表)。我发现更容易将map f
视为在列表之间生成函数,而不是在两个参数中部分应用函数。在map的类型定义中,您确定[a]->[b]应该放在括号中(它本身就是一个函数??)@Imray(a->b)->([a]->[b])
和(a->b)->[a]->[b]
是相同的,函数箭头是右关联的。@Imray-我已经添加了一个关于uncurry
的解释。至于map
,我认为将其视为将“常规”函数提升到列表之上的函数是有帮助的(即,将函数从a移到b,并将函数从a的列表返回到b的列表)。我发现更容易将映射f
视为在列表之间生成函数,而不是在两个参数中部分应用函数。