比较两个字符串列表的函数

A function that compare a two lists of string

我是 F# 的新手,我尝试完成这个任务:

制作一个函数比较:字符串列表 -> 字符串列表 -> 接受两个字符串列表的 int returns:-1、0 或 1

请帮忙。我花了很多时间,我无法理解如何实现这个任务。

根据任务,我假设你的教授想通过这个练习教你什么。我会尝试给你一个没有

的起点
  1. 让你困惑
  2. 提出'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

原问题已回答,发帖供参考。