F# 在给定索引f处拆分列表#

F# 在给定索引f处拆分列表#,f#,F#,对于我正在学习的课程,我必须做以下练习: 实现一项功能 let splitAt (i : int) (l : List<'a>) : List<'a> * List<'a> = ... 但是,这给了我几个错误,即: 所有类型的'a list,'a list都不支持操作员* 此表达式应具有类型int,但此处具有类型char list 此表达式应具有类型List,*运算符用于声明元组类型,但在构建元组时,使用的是,。因此,您需要restlist,startlis

对于我正在学习的课程,我必须做以下练习:

实现一项功能

let splitAt (i : int) (l : List<'a>) : List<'a> * List<'a> = ...
但是,这给了我几个错误,即:

所有类型的
'a list
'a list
都不支持操作员
*

此表达式应具有类型
int
,但此处具有类型
char list


此表达式应具有类型
List,
*
运算符用于声明元组类型,但在构建元组时,使用的是
。因此,您需要
restlist,startlist

然后您会发现还有另一个类型错误,因为
匹配
表达式的一个分支返回
None
。这是一种选项类型,因此返回的值应该是
Some
。所以你想要
一些(restlist,startsist)

现在您将发现另一个类型错误,即您声明函数返回一个元组,但实际上它返回一个元组选项(即,
None
Some tuple
)。因此,您的类型声明需要成为
(列表)选项


有关为什么在声明元组类型时使用
*
而不是
的更多信息,
是一本很好的读物。

因为这是一个类,所以我没有研究您的逻辑是否正确;无论如何,你自己弄清楚这一点,你会学到最好的东西。我仅限于帮助您理解语法,因此代码是您明确想要编写的,无论是否正确。修复指出的类型问题,您将非常接近。一些小指针
|h::[]->无
是针对列表中的
惊吓者的例子。您想要匹配一个空列表,它只是
[]
。另外还有一个使用列表的提示:如果您想将值附加到另一个列表,您需要
(restlist@[h])
,而不是
。祝你好运
let splitAt (i:int)(l: List<'a>): List<'a> * List<'a> = 
    let rec loop n startlist restlist = 
        if n = i then
            restlist * startlist
        else
            match startlist with
            | h :: t -> loop (n+1) [t] [(restlist :: h)]
            | h :: [] -> None
    loop 0 l []         
printfn "%A" (splitAt stringlist 3)