Math F#:声明函数并在列表中查找元素

Math F#:声明函数并在列表中查找元素,math,functional-programming,f#,computer-science,f#-interactive,Math,Functional Programming,F#,Computer Science,F# Interactive,我对F#很陌生,需要一些帮助来解决一个问题。在列表中查找元素时遇到问题: 声明一个函数findurote:Lid*luggagecatalog->Route,用于在行李目录中查找给定行李标识的路线 我列出了不同的类型,并给出了类型元素 type Lid = string type Flight = string type Airport = string type Route = (Flight*Airport) list let route = [("

我对F#很陌生,需要一些帮助来解决一个问题。在列表中查找元素时遇到问题: 声明一个函数findurote:Lid*luggagecatalog->Route,用于在行李目录中查找给定行李标识的路线

我列出了不同的类型,并给出了类型元素

    type Lid = string 
    type Flight = string
    type Airport = string
    type Route = (Flight*Airport) list
    let route = [("DL 189","ATL"); ("DL 124","BRU"); ("SN 733","CPH"); ("SK 208","ATL"); ("DL 124","BRU"); ("SK 122","JFK")]

    type LuggageCatalogue = (Lid*Route) list
    let lc = [("DL 016-914", [("DL 189","ATL"); ("DL 124","BRU"); ("SN 733","CPH")]); 
    ("SK 222-142", [("SK 208","ATL"); ("DL 124","BRU"); ("SK 122","JFK")])]


    let findRoute fr = function
    match fr with
    | [] -> printf "No match"
    |

我陷入困境的地方是我找不到正确的方法来使用该功能查找
行李目录
列表中的元素

也许您可以从筛选行李目录开始,以更好地了解发生了什么,例如

let filterlist lid = List.filter (fun (luggageid, _) -> luggageid = lid)
然后在目录中找到一个特定的项目

filterlist "SK 222-142" lc
或者更好的是,尝试自己创建函数的第一部分。尽管这只是第一步,但不妨尝试想象一下行李id的递归搜索函数的外观

let findfirst lid =
  let rec checktail lctail =
    match lctail with
    | [] -> invalidArg "lid" "luggageid not present in catalogue"
    | (id, r)::tail -> if id = lid then r else checktail tail
  checktail lc

问题似乎是您还没有真正编写任何代码。你应该试着这样做,然后带着一个更具体的问题回来,比如编译器错误或者它没有产生你期望的结果。请不要删除问题的关键部分。如果你在绕过一些反剽窃或反作弊工具时遇到困难,你真的应该在做这件事之前考虑到这一点。非常感谢你的回答!为接下来的几项任务打开了我的眼界。你能解释一下“r”在辩论中的用法吗?@B.O.C.当然。这是一个更好的F#特征——模式匹配。如果你写这个代码,让(id,r)::tail=lc来自
lc
的数据被分成几个“片段”。在这种情况下,
id
将是字符串“DL 016-914”,
r
将成为字符串列表[(“DL 189”,“ATL”);(“DL 124”,“BRU”);(“SN 733”,“CPH”)],
tail
将是
lc
行李目录的其余部分,其中丢弃了目录(列表)的第一个“项目”。