List 使用折回将字符列表转换为字符串
对于赋值,我正在寻找一种使用list.foldBack从字符列表连接字符串的方法 到目前为止,我想到的是:List 使用折回将字符列表转换为字符串,list,f#,type-inference,List,F#,Type Inference,对于赋值,我正在寻找一种使用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
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
我做错了什么,如何使用折回获得期望的结果
:字符列表
适用于内爆
的返回类型,而不是xs
。如果需要后者((xs:char list)
),则需要将其括起来List.foldBack
对于某些'a
和'b
,需要使用带有签名的函数'a->'b->'b
,但是(.+)
具有类型字符串->字符->字符串
,这不太匹配(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”“
将内爆
更改为这个让内爆(xs:char)(l:char List)=List.foldBack(趣味辅助元素->(.+)辅助元素)xs“”
你会得到一个新错误,但它应该能帮助你解决问题。既然你说了作业,我认为这是家庭作业,你可以通过轻推而不是回答学到更多。版本为List.fold:尝试更改为List.foldback你的问题已经解决了?@GuyCoder帮我解决了。最终使用了一个实现cl根据kvbI的建议,ose认为更容易更改运算符:(.+):char->string->string…=>List.foldBack((.+))xs“”使用以下命令结束。赋值暗示了foldBack,但fold看起来更直观?let(+)(x1:string)(x2:char)=x1+(string x2)let内爆((xs:char List))=List.fold(fun elem acc->(.+)elem acc)“xs