gpt4 book ai didi

Scala:高级类型作为类型参数

转载 作者:行者123 更新时间:2023-12-01 05:20:51 25 4
gpt4 key购买 nike

请考虑以下代码片段(它演示了我实际问题的简化版本):

trait Id[Type[_]] {
def id[S]: S => Type[S]
}

trait IdTransformer[Type[_]] {
type Result[_] // depends of Type
def idTransform[P]: P => Result[P]
def composeWith[Other[_]](other: Id[Other]) = new Id[Result[Other]] { def id[S] = x => idTransform(other.id(x)) }
}

// instance example
class OptionIdTransformer extends IdTransformer[Option] {
type Result = Option[_]
def idTransform[S] = x => Some(x)
}

我有 Id trait 定义了一个将值包装成类型的函数,IdTransformer trait 定义了一种向 id 操作添加新逻辑的方法。我想像这样使用它们
Transformer1.composeWith(Transformer2.composeWith(...(idInstance)))

但是当我编译代码时,我收到错误消息
type Other takes type parameters


IdTransformer.this.Result[<error>] takes no type parameters, expected: one 

在 composeWith 方法中,虽然 Result[Other] 应该是一个更高级的类型并且应该采用单个类型参数。
请解释错误的原因是什么以及是否有解决方法。

最佳答案

您正在尝试将一个高级别的类型与其他两个高级别的类型组合在一起。需要什么叫做 type lambda 的技巧.

trait IdTransformer[Type[_]] {
type Result[_] // depends of Type
def idTransform[P]: P => Result[P]
def composeWith[Other[_]](other: Id[Other]) = new Id[({type λ[α] = Result[Other[α]]})#λ] { def id[S] = x => idTransform(other.id(x)) }
}

关于Scala:高级类型作为类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16813323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com