如何解决定义一个通用的展开函数
<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 举报,一经查实,本站将立刻删除。