作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Type Driven Development with Idris介绍这个程序:
StringOrInt : Bool -> Type
StringOrInt x = case x of
True => Int
False => String
最佳答案
Alexey 的回答很好,但我认为如果我们将它嵌入到更大的上下文中,我们可以得到这个函数的更通用的 Scala 渲染。
Edwin 展示了 StringOrInt
的用法在函数中 valToString
,
valToString : (x : Bool) -> StringOrInt x -> String
valToString x val = case x of
True => cast val
False => val
valToString
需要一个
Bool
第一个参数将其第二个参数的类型固定为
Int
或
String
并将后者呈现为
String
适合其类型。
sealed trait Bool
case object True extends Bool
case object False extends Bool
sealed trait StringOrInt[B, T] {
def apply(t: T): StringOrIntValue[T]
}
object StringOrInt {
implicit val trueInt: StringOrInt[True.type, Int] =
new StringOrInt[True.type, Int] {
def apply(t: Int) = I(t)
}
implicit val falseString: StringOrInt[False.type, String] =
new StringOrInt[False.type, String] {
def apply(t: String) = S(t)
}
}
sealed trait StringOrIntValue[T]
case class S(s: String) extends StringOrIntValue[String]
case class I(i: Int) extends StringOrIntValue[Int]
def valToString[T](x: Bool)(v: T)(implicit si: StringOrInt[x.type, T]): String =
si(v) match {
case S(s) => s
case I(i) => i.toString
}
True.type
和 False.type
从值(value)层面跨越到类型层面。 StringOrInt
进行编码作为由单例索引的类型类 Bool
类型,Idris 函数的每种情况都由一个不同的隐式实例表示。 valToString
作为 Scala 依赖方法,允许我们使用 Bool
的单例类型参数x
选择隐式 StringOrInt
实例si
,这又决定了类型参数 T
它修复了第二个参数的类型 v
. valToString
通过使用选定的 StringOrInt
实例解除 v
参数转换成 Scala GADT,它允许 Scala 模式匹配来细化 v
的类型在案件的 RHS 上。 scala> valToString(True)(23)
res0: String = 23
scala> valToString(False)("foo")
res1: String = foo
关于scala - 来自 Idris -> Scala 的 StringOrInt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33818791/
Type Driven Development with Idris介绍这个程序: StringOrInt : Bool -> Type StringOrInt x = case x of
我是一名优秀的程序员,十分优秀!