【问题标题】:Type Alias for Function Types in Scala [closed]Scala中函数类型的类型别名[关闭]
【发布时间】:2021-11-06 11:48:17
【问题描述】:

我是 Scala 语言的新人,但我无法理解 type Set = Int => Boolean 的工作原理。我知道这是与布尔值转换的整数。我有def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x)) 存在def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, i => !p(i))) 和

def forall(s: Set, p: Int => Boolean): Boolean = {
    def iter(a: Int): Boolean = {
      if (a > bound) true
      else if (diff(s,p)(a)) false
      else iter(a + 1)
    }
    iter(-bound)
  }

这两个函数我理解,但是map 函数我有问题。如果我称它为 map(Set(2,3,5), i => i * 20),我只是不明白它是如何显示答案的。我得到{40,60,100}。我试图理解它,我知道xs 中的每个元素,f(x) 是 x 元素,乘以 20。y 的范围从 -1000 到 1000 (bound = 1000)。我读这个函数是这样的:y is range -1000..1000 in exists function is getting our Set(2,3,5) and after it give somthing with Boolean type.我如何得到像{40,60,100} 这样的答案。新系列是如何在那里创建的?

完整代码->

  type Set = Int => Boolean

  def contains(s: Set, elem: Int): Boolean = s(elem)
  def diff(s: Set, t: Set): Set = (i: Int)  => s(i) && !t(i)

  val bound = 1000

  def forall(s: Set, p: Int => Boolean): Boolean = {
    def iter(a: Int): Boolean = {
      if (a > bound) true
      else if (diff(s,p)(a)) false
      else iter(a + 1)
    }
    iter(-bound)
  }

  def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))
  def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x))

  def toString(s: Set): String = {
    val xs = for (i <- -bound to bound if contains(s, i)) yield i
    xs.mkString("{", ",", "}")
  }

  println(toString(map(Set(2, 3, 5), (i: Int) => i * 20)))

【问题讨论】:

    标签: scala function types functional-programming alias


    【解决方案1】:

    鉴于map() 实现...

    y => exists(s, x => y == f(x))
    

    ...和调用...

    map(Set(2,3,5), (i: Int) => i * 20)
    

    ...做一些替换,你会得到:

    val mappedSet = y => exists(Set(2,3,5), x => y == x*20)
    

    SetInt =&gt; Boolean(一个接受 Int 并返回 truefalse 的函数),mappedSet 是一个要求:

    给定一个数字y,在 + 边界内是否存在一个既通过(是)Set(2,3,5) 并且当乘以 20 时等于 y 的数字?

    mappedSet(60) 返回 true,因为在 + 边界内确实存在一个数字 3,它既是 Set(2,3,5) 的成员,又是相乘时乘以 20,等于 60

    mappedSet(80) 返回 false,因为找不到通过这两个测试的数字。

    【讨论】:

    • 我明白了,非常感谢 :) 也许你可以给我推荐一些书籍或网站,让我可以更多地学习这种语言和这种情况?
    猜你喜欢
    • 2014-10-06
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多