如何在F#中定义这个懒惰(无限?)数据结构

时间:2013-12-02 21:18:06

标签: f#

我在定义以下简单文本游标时遇到问题,该游标由元组表示,其中第一个元素是当前字符,第二个元素是获取下一个元素或崩溃的函数。

let rec nextAt index text = 
    if index < String.length text then
        (text.[index], (fun() -> nextAt (index + 1) text))
    else
        failwith "End of string."

我正在

Error   1   Type mismatch. Expecting a
    char * (unit -> 'a)    
but given a
    'a    
The resulting type would be infinite when unifying ''a' and 'char * (unit -> 'a)'

1 个答案:

答案 0 :(得分:4)

您必须使用中间类型:

type GetNext = GetNext of (unit -> char * GetNext)

let rec nextAt index text = 
    if index < String.length text then
        (text.[index], GetNext(fun () -> nextAt (index + 1) text))
    else
        failwith "End of string."

this question about y combinator的答案更深入地探讨了这一局限,并提出了解决方法。