定义一个通用的展开函数

问题描述

<link href="bootstrap.css" rel="stylesheet">
<link href="yours.css" rel="stylesheet">

使用此定义,我收到以下错误

func unfoldr<A,B>(_ f: @escaping (B) -> (A,B)?) -> (B) -> UnfoldFirstSequence<A> {
    return { b in sequence(
        first: b,next: { x in
                switch f(x) {
                case .some(let(a,b)):
                    return Optional(a)
                default:
                    return Optional.none
            }
            }
        )
    }
}

有没有办法解决这个问题并定义这个函数

解决方法

您的序列似乎不是 UnfoldFirstSequence。您的序列似乎有一个状态 B,而 f 负责为该序列生成一个新状态和一个元素。 UnfoldFirstSequence 没有您可以控制的状态。您只能从前一个元素生成下一个元素。

您的序列可以通过更通用的 UnfoldSequence 建模,它具有一个 State 通用参数。事实上,UnfoldFirstSequence<T> 只是一个 UnfoldSequence<T,(T?,Bool)>!通过reading the source code :)

了解为什么前者是后者的特例

您可以使用 sequence(state:next:) 创建这样的序列。

func unfoldr<A,B>(_ f: @escaping (B) -> (A,B)?) -> (B) -> UnfoldSequence<A,B> {
    return {
        sequence(state: $0) { x in
            guard let (a,b) = f(x) else { 
                return nil 
            } 
            x = b 
            return a
        }
    }
}

示例:

let seq = unfoldr { x -> (String,Int)? in
    if x == 10 {
        return nil
    } else {
        return ("\(x)",x + 1)
    }
}
seq(0).forEach { print($0) }