对于作业,我正在寻找一种使用List.foldBack连接字符列表中字符串的方法。
到目前为止,我提出了什么:
let (.+) (x1:string) (x2:char) = x1 + System.Char.ToString(x2)
let implode xs:char list = List.foldBack(fun acc elem -> (.+) acc elem) xs ""
但是,这会给我以下错误消息:
This expression was expected to have type
char list
but here has type
string
我做错了什么,如何使用foldBack
获得所需的结果答案 0 :(得分:2)
:char list
适用于implode
的返回类型,而不适用于xs
。如果你想要后者((xs:char list)
)。List.foldBack
需要对某些'a -> 'b -> 'b
和'a
采用带有签名'b
的函数,但(.+)
的类型为string -> char -> string
,不太匹配。答案 1 :(得分:1)
除了撰写(xs : char list)
之外,您还需要正确排序(.+)
的参数。
List.foldBack : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
Required (char -> string -> string) -> char list -> string -> string
Actual ... (fun acc elem -> (.+) acc elem) ...
which is : (string -> char -> string)
如果您将acc
和elem
交换为(.+) elem acc
,则代码将会编译。
List.foldBack : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
Required (char -> string -> string) -> char list -> string -> string
Actual ... (fun acc elem -> (.+) elem acc)
其中(.+) : string -> char -> string
或者正如Foggy Finder建议的那样,更改运算符(.+)
以便交换它们的参数(let (.+) (x1:char) (x2:string) = System.Char.ToString(x1) + x2
),然后我们可以使用List.foldBack (.+) xs ""
。