Kotlin:函数式编程,密封class 列表
Kotlin: functional programming, sealed class List
我正在使用密封的 class 列表和映射函数练习一些函数式编程。
至此密码为封class
sealed class List <T> {
class Node <T> ( val head : T , val tail : List<T>) : List<T> () {
override fun toString () =
"${head.toString()} , ${tail.toString()}"
}
object Nil : List<Nothing> () {
override fun toString () = "NIL"
}
companion object {
operator
fun <T> invoke (vararg values : T ) : List<T>{
val empty = Nil as List<T>
val res = values.foldRight( empty , { v, l -> l.addFirst(v) })
return res
}
}
fun addFirst ( head : T ) : List<T> = Node (head , this)
fun removeFirst () : List <T> = when (this) {
is Nil -> throw IllegalStateException()
is Node<T> -> this.tail
}
}
地图功能inside sealed class 工作正常,但现在我想要它 运行 外面密封class喜欢
fun <T,R> map (list:List<T>, f: (T) -> R) {
when(list) {
is List.Nil -> List.Nil as List<R>
is List.Node -> List.Node<R> (f(head), tail.map(f))
}
}
但是现在 "head" 和 "tail" 不再工作,因为引用未解决。我尝试了不同的策略,但没有任何效果。任何想法如何解决它?
经过更多有趣的研究后找到了解决方案 List.map (f : (T) -> R) : List = when (this) { List.Nil -> List.Nil as List是 List.Node -> List.Node (f(head), tail.map(f)) }
我正在使用密封的 class 列表和映射函数练习一些函数式编程。
至此密码为封class
sealed class List <T> {
class Node <T> ( val head : T , val tail : List<T>) : List<T> () {
override fun toString () =
"${head.toString()} , ${tail.toString()}"
}
object Nil : List<Nothing> () {
override fun toString () = "NIL"
}
companion object {
operator
fun <T> invoke (vararg values : T ) : List<T>{
val empty = Nil as List<T>
val res = values.foldRight( empty , { v, l -> l.addFirst(v) })
return res
}
}
fun addFirst ( head : T ) : List<T> = Node (head , this)
fun removeFirst () : List <T> = when (this) {
is Nil -> throw IllegalStateException()
is Node<T> -> this.tail
}
}
地图功能inside sealed class 工作正常,但现在我想要它 运行 外面密封class喜欢
fun <T,R> map (list:List<T>, f: (T) -> R) {
when(list) {
is List.Nil -> List.Nil as List<R>
is List.Node -> List.Node<R> (f(head), tail.map(f))
}
}
但是现在 "head" 和 "tail" 不再工作,因为引用未解决。我尝试了不同的策略,但没有任何效果。任何想法如何解决它?
经过更多有趣的研究后找到了解决方案 List.map (f : (T) -> R) : List = when (this) { List.Nil -> List.Nil as List是 List.Node -> List.Node (f(head), tail.map(f)) }