1
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
            }
            }
        )
    }
}

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

Cannot convert value of type 'B' to expected argument type 'A'.

有没有办法解决这个问题并定义这个功能?

4

1 回答 1

0

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

您的序列可以由更通用的模型建模UnfoldSequence,它具有State通用参数。事实上, anUnfoldFirstSequence<T>只是一个UnfoldSequence<T, (T?, Bool)>! 通过阅读源代码了解为什么前者是后者的特例:)

您可以使用创建这样的序列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) }
于 2021-02-24T02:24:17.437 回答