对不起,如果这是非常基础的,我是函数式编程和F#的新手.
我必须创建一个函数,它接受一个元组列表(string*int)并返回一个元组列表(string*int)
所以基本上我想将一些函数应用于pairList中的每个元组并返回一个元组列表.
我猜我可以通过递归函数来做到这一点.
到目前为止,我有以下代码:
let rec aFunction (pairList:List<string*int>): List<string*int> =
match pairList with
| [] -> []
| head :: tail -> [fst head,snd (someFunc1 (someFunc2 (fst head,snd head)))]
Run Code Online (Sandbox Code Playgroud)
这基本上只是将各种函数应用于列表的头部并返回一个元组列表.
为了使它适用于整个列表,我尝试了以下方法:
| head :: tail -> [fst head,snd (someFunc1 (someFunc2 (fst head,snd head)));aFunction tail]
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
该表达式应该具有类型字符串*int,但这里的类型为List <string*int>
事实上这个功能确实存在 - 它被称为List.map
.
要分析您的错误,当您执行[a;b]
a
并且b
需要具有相同类型时.
你想要的是使用这样的连接运算符::
:
| head :: tail -> (fst head,snd (someFunc1 (someFunc2 (fst head,snd head)))) :: (aFunction tail)
Run Code Online (Sandbox Code Playgroud)
但你可以通过模式匹配以更好的方式使这个整洁
| (a,b) :: tail -> (a,snd (someFunc1 (someFunc2 (a,b)))) :: (aFunction tail)
Run Code Online (Sandbox Code Playgroud)
约翰·帕尔默斯的回答非常好,但为了清晰和可读性,我可能会一路走下去做以下事情:
let someFunc1 = id //just to make it compile
let someFunc2 = id //just to make it compile
let someFunc3 = someFunc2 >> someFunc1 >> snd
let someFunc4 head = fst head, someFunc3 head
let rec aFunction (pairList:List<string*int>): List<string*int> =
match pairList with
| [] -> []
| head :: tail -> someFunc4 head :: (aFunction tail)
Run Code Online (Sandbox Code Playgroud)