微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

定义一个通用的展开函数

如何解决定义一个通用的展开函数

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。