想添加一个不太关注currying/uncurrying的答案。这涉及到其他人已经在这里提出的一些观点,但希望更多细节会有所帮助。
关于您的问题,如果您想传入lambda function,则需要fun 关键字。您可以通过更改函数签名来避免这种情况:
let toCamelCase (word, indexes) =
let mapping i c =
match (indexes |> List.contains i) with
| true -> Char.ToUpper(c)
| _ when Char.IsUpper(c) -> Char.ToLower(c)
| _ -> c
word |> String.mapi mapping
[
("fsharP", [0; 1])
("nAtiveinterop", [0; 6])
("taskbuildereXtensions", [0; 4; 11])
("microsoftword", [0; 9])
]
|> List.map toCamelCase
如果您使用的是一个函数,无论出于何种原因,您都无法进行此更改,您可以创建一个中间辅助函数(这实际上是手动取消柯里化):
let toCamelCase word indexes =
let mapping i c =
match (indexes |> List.contains i) with
| true -> Char.ToUpper(c)
| _ when Char.IsUpper(c) -> Char.ToLower(c)
| _ -> c
word |> String.mapi mapping
let toCCHelper (word, indexes) =
toCamelCase word indexes
[
("fsharP", [0; 1])
("nAtiveinterop", [0; 6])
("taskbuildereXtensions", [0; 4; 11])
("microsoftword", [0; 9])
]
|> List.map toCCHelper
您可以选择稍微简化您的 lambda 函数而不做其他任何更改。这是有效的,因为双管道 (||>) 将为您解构元组输入:
let toCamelCase word indexes =
let mapping i c =
match (indexes |> List.contains i) with
| true -> Char.ToUpper(c)
| _ when Char.IsUpper(c) -> Char.ToLower(c)
| _ -> c
word |> String.mapi mapping
[
("fsharP", [0; 1])
("nAtiveinterop", [0; 6])
("taskbuildereXtensions", [0; 4; 11])
("microsoftword", [0; 9])
]
|> List.map (fun x -> x ||> toCamelCase)
还有一些括号是不需要的,所以这取决于你的喜好。这里有一些清理以及一些逻辑更改供您考虑:
let toCamelCase (word, indexes) =
let mapping i c =
// You can omit parens here if you want:
match indexes |> List.contains i with
// This logic might be easier to maintain, no parens needed here:
| true -> Char.ToUpper c
| false -> Char.ToLower c
word |> String.mapi mapping
// The parens here are also optional when you're putting 1 entry per line
// (1 tuple being 1 entry in this case):
[
"fsharP", [0; 1]
"nAtiveinterop", [0; 6]
"taskbuildereXtensions", [0; 4; 11]
"microsoftword", [0; 9]
]
|> List.map toCamelCase