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)