阅读"为了伟大的利益而学习Haskell",并试图理解这本书中的Haskell概念可能是如何在Scala 3中编写的。
第11章在关于函数作为函式的部分提到了"部分应用的类型构造函数":
另一个我们一直在讨论但不知道是函数的例子是(-〉)r.你现在可能有点困惑了,因为(-〉)r表示?函数类型r-〉a可以重写为(-〉)r a,就像我们可以把2 + 3写成(+)2 3.当我们把它看作(-〉)r a,我们可以看到(-〉),因为我们看到它只是一个类型构造函数它有两个类型参数,就像Either一样,但是记住,我们说过类型构造函数必须只带一个类型参数才能成为Functor的示例。这就是为什么我们不能(-〉)一个Functor的示例,但是如果我们将其部分应用于(-〉)R**,它不会造成任何问题。如果语法允许类型构造函数部分地应用于节(就像我们可以通过执行(2+)来部分应用+,这与(+)2相同),您可以将(-〉)r写成(r-〉)
instance Functor ((->) r) where
fmap f g = (\x -> f (g x))
我理解书中的所有这些逻辑+Haskell处理类型构造函数就像处理通常的函数一样的事实-那些可以被curry和部分应用。
- 问题:**
Scala 3类似于这种部分应用的类型构造函数,因此我们可以用类似于下面Haskell定义的方式定义fmap
。
(it smth是否可以用更高级的类型来建模?)
1条答案
按热度按时间p5cysglq1#
在Scala 3中,您可以使用type lambdas
或kind projector(
scalacOptions += "-Ykind-projector"
)最终这应该成为
Polymorphic method works with type lambda, but not with type wildcard in Scala 3