Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在Haskell中,将Lambda函数转换为正则函数的过程_Function_Haskell_Lambda - Fatal编程技术网

Function 在Haskell中,将Lambda函数转换为正则函数的过程

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,

下面是我试图理解的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
简单地说,该程序获取字符串元组列表并生成条目对象列表

但是,我不喜欢
映射中的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
视为在列表之间生成函数,而不是在两个参数中部分应用函数。