F#:需要帮助反转ilist的顺序吗
我必须使用以下数据类型:F#:需要帮助反转ilist的顺序吗,list,f#,List,F#,我必须使用以下数据类型: type ilist = E | L of int * ilist 在处理标准类型以外的联机列表([1;2;3])方面,我似乎找不到太多帮助 我要写一个函数,它接受列表并反转顺序 例如:反向(L(1,L(2,L(3,E)))将输出(L(3,L(2,L(1,E))) 到目前为止,我的代码如下: let rec reverse l = match l with | E -> failwith "Empty List" | L(h,
type ilist = E | L of int * ilist
在处理标准类型以外的联机列表([1;2;3])方面,我似乎找不到太多帮助
我要写一个函数,它接受列表并反转顺序
例如:反向(L(1,L(2,L(3,E)))将输出(L(3,L(2,L(1,E)))
到目前为止,我的代码如下:
let rec reverse l =
match l with
| E -> failwith "Empty List"
| L(h, E) -> h
| L(h, t) -> // append tail and recursive call with rest of list?
let list = reverse (L(1, L(2, L(3, E))))
printfn "reversed list: %A" list
谢谢你的帮助 您缺少的是将
int
附加到ilist
的便捷方法:
let rec append x l =
match l with
| E -> L (x,E)
| L (h,t) -> L (h,append x t)
printfn "%A" (append 4 list)
现在,在上一个匹配案例中使用此函数将h
附加到反向的t
:
let rec reverse l =
match l with
| E -> E
| L (h,t) -> append h (reverse t)
请注意,当输入列表为空时,最好只返回一个空列表(|E->E
),因为failwith
非常难看,您应该只在最罕见的情况下使用
还要注意,第二个匹配用例|L(h,E)->h
是错误的,因为它返回的是int
,而不是ilist
。但它是不需要的,所以只要删除它。单例列表L(h,E)
将与|L(h,t)->……
匹配,后者依次递归地将t
与|E->E
匹配
下面是一个工作示例:的可能重复在链接的重复中,内置列表类型仍在使用,但函数已定义。您只需要将
[]
替换为E
大小写,将head::tail
替换为L(head,tail)
大小写。这看起来像是将列表拆分为子列表?所以我相信这不是一个重复的问题,或者这只是一个参考问题?原来的问题有点不同,但答案是一样的。接受答案中的反向功能应该是您所需要的全部功能。