比较两个字符串列表的函数
A function that compare a two lists of string
我是 F# 的新手,我尝试完成这个任务:
制作一个函数比较:字符串列表 -> 字符串列表 -> 接受两个字符串列表的 int returns:-1、0 或 1
请帮忙。我花了很多时间,我无法理解如何实现这个任务。
根据任务,我假设你的教授想通过这个练习教你什么。我会尝试给你一个没有
的起点
- 让你困惑
- 提出'done-deal'解决方案
我假设此任务的目标是使用递归函数和模式匹配来 element-wise 比较它们的元素。它可能看起来有点像这里
open System
let aList = [ "Apple"; "Banana"; "Coconut" ]
let bList = [ "Apple"; "Banana"; "Coconut" ]
let cList = [ "Apple"; "Zebra" ]
let rec doSomething f (a : string list) (b : string list) =
match (a, b) with
| ([], []) ->
printfn "Both are empty"
| (x::xs, []) ->
printfn "A has elements (we can unpack the first element as x and the rest as xs) and B is empty"
| ([], x::xs) ->
printfn "A is empty and B has elements (we can unpack the first element as x and the rest as xs)"
| (x::xs, y::ys) ->
f x y
printfn "Both A and B have elements. We can unpack them as the first elements x and y and their respective tails xs and ys"
doSomething f xs ys
let isItTheSame (a : string) (b : string) =
if String.Equals(a, b) then
printfn "%s is equals to %s" a b
else
printfn "%s is not equals to %s" a b
doSomething isItTheSame aList bList
doSomething isItTheSame aList cList
该示例有三个不同的列表,其中两个相同,另一个不同。 doSomething
函数接受一个函数 (string -> string -> unit
) 和两个字符串列表。
在该函数中,您会在最后一个匹配块中看到模式匹配以及 doSomething
的递归调用。签名并不完全是您所需要的,您可能想考虑如何在您不想停止递归的情况下更改参数化(最后一个匹配块 - 如果字符串相等,您希望继续比较,对吧?)。
只需获取代码并在 FSI 中试用即可。我相信您会找到解决方案
在 F# 中,如果元素类型为:
,则许多集合是可比较的
let s1 = [ "a"; "b" ]
let s2 = [ "foo"; "bar" ]
compare s1 s2 // -5
let f1 = [ (fun () -> 1); fun () -> 2 ]
let f2 = [ (fun () -> 3); fun () -> 42 ]
// compare f1 f2 (* error FS0001: The type '(unit -> int)' does not support the 'comparison' constraint. *)
所以
let slcomp (s1 : string list) s2 = compare s1 s2 |> sign
原问题已回答,发帖供参考。
我是 F# 的新手,我尝试完成这个任务:
制作一个函数比较:字符串列表 -> 字符串列表 -> 接受两个字符串列表的 int returns:-1、0 或 1
请帮忙。我花了很多时间,我无法理解如何实现这个任务。
根据任务,我假设你的教授想通过这个练习教你什么。我会尝试给你一个没有
的起点- 让你困惑
- 提出'done-deal'解决方案
我假设此任务的目标是使用递归函数和模式匹配来 element-wise 比较它们的元素。它可能看起来有点像这里
open System
let aList = [ "Apple"; "Banana"; "Coconut" ]
let bList = [ "Apple"; "Banana"; "Coconut" ]
let cList = [ "Apple"; "Zebra" ]
let rec doSomething f (a : string list) (b : string list) =
match (a, b) with
| ([], []) ->
printfn "Both are empty"
| (x::xs, []) ->
printfn "A has elements (we can unpack the first element as x and the rest as xs) and B is empty"
| ([], x::xs) ->
printfn "A is empty and B has elements (we can unpack the first element as x and the rest as xs)"
| (x::xs, y::ys) ->
f x y
printfn "Both A and B have elements. We can unpack them as the first elements x and y and their respective tails xs and ys"
doSomething f xs ys
let isItTheSame (a : string) (b : string) =
if String.Equals(a, b) then
printfn "%s is equals to %s" a b
else
printfn "%s is not equals to %s" a b
doSomething isItTheSame aList bList
doSomething isItTheSame aList cList
该示例有三个不同的列表,其中两个相同,另一个不同。 doSomething
函数接受一个函数 (string -> string -> unit
) 和两个字符串列表。
在该函数中,您会在最后一个匹配块中看到模式匹配以及 doSomething
的递归调用。签名并不完全是您所需要的,您可能想考虑如何在您不想停止递归的情况下更改参数化(最后一个匹配块 - 如果字符串相等,您希望继续比较,对吧?)。
只需获取代码并在 FSI 中试用即可。我相信您会找到解决方案
在 F# 中,如果元素类型为:
,则许多集合是可比较的let s1 = [ "a"; "b" ]
let s2 = [ "foo"; "bar" ]
compare s1 s2 // -5
let f1 = [ (fun () -> 1); fun () -> 2 ]
let f2 = [ (fun () -> 3); fun () -> 42 ]
// compare f1 f2 (* error FS0001: The type '(unit -> int)' does not support the 'comparison' constraint. *)
所以
let slcomp (s1 : string list) s2 = compare s1 s2 |> sign
原问题已回答,发帖供参考。