我很难弄清楚如何从Scala高阶函数定义跳转到提供的示例.在幻灯片81上的幻灯片放映中提供了它.
这是高阶函数定义:
trait X[A] { def map[B](f: A => B): X[B] }
Run Code Online (Sandbox Code Playgroud)
这是提供的示例:
(1 to 10) map { x => x * 2 } // evaluates to Vector(2, 4, ..., 20)
(1 to 10) map { _ * 2 } // shorthand!
Run Code Online (Sandbox Code Playgroud)
咦?我不知道在这里有一些步骤.我得到的例子可能是利用函数定义和一些Scala细节.我只是没有足够的经验阅读Scala并做出连接假设.
我的背景是Java OO.我现在正在学习Scala和函数式编程.这不是第一个我不明白的例子.这只是第一个我觉得我有勇气发帖知道我会看起来无知的人.
我确实试过研究这个.首先,我去了Scala"圣经","Scala第二版编程",并尝试从那里了解是否存在(第165-9页).然后,我在StackOverflow上搜索了一下.我找到了几个围绕该地区的链接.但是,实际上并没有向我展示Scala高阶函数定义与提供的示例之间的连接,其方式是映射到此幻灯片中的特定实例.
这是我在StackOverflow上发现的:
我刚才意识到我跳过谷歌直接进入StackOverflow.嗯.如果你google并找到正确的链接,我很乐意看到它.我没有时间筛选使用像Monkey-monad,blastomorphisms等术语的所有谷歌链接,同时让我更加困惑,不太可能尝试解决这个问题.
在研究如何在Scala中进行Memoization时,我发现了一些我没有理解的代码.我试图看看这个特别的"东西",但不知道该怎么称呼它; 即引用它的术语.另外,用符号搜索并不容易,唉!
我在这里看到以下代码在Scala中进行memoization :
case class Memo[A,B](f: A => B) extends (A => B) {
private val cache = mutable.Map.empty[A, B]
def apply(x: A) = cache getOrElseUpdate (x, f(x))
}
Run Code Online (Sandbox Code Playgroud)
这就是案例类正在扩展的内容,这让我感到困惑extends (A => B).首先,发生了什么?其次,为什么甚至需要呢?最后,你称之为这种继承; 即是否有一些特定的名称或术语可供我参考?
接下来,我看到这样计算Fibanocci号码使用备注这里:
val fibonacci: Memo[Int, BigInt] = Memo {
case 0 => 0
case 1 => 1
case n => fibonacci(n-1) + fibonacci(n-2)
}
Run Code Online (Sandbox Code Playgroud)
可能我没有看到正在应用的所有"简化".但是,我无法弄清楚这val条线的终点= Memo {.因此,如果更详细地输入,也许我会理解正在构建备忘录的"跳跃".
非常感谢对此提供的任何帮助.谢谢.
我有一个案例类定义如下:
case class StreetSecondary(designator: String, value: Option[String])
Run Code Online (Sandbox Code Playgroud)
然后我定义一个显式的伴侣对象:
object StreetSecondary {
//empty for now
}
Run Code Online (Sandbox Code Playgroud)
定义显式伴随对象StreetSecondary的行为导致编译器生成"隐含伴随对象"丢失; 即替换为无法访问编译器生成的版本.例如,该tupled方法可通过此隐式伴随对象在案例类StreetSecondary上使用.但是,一旦我定义了显式伴随对象,该tupled方法就会"丢失".
那么,我需要定义/添加/更改上面的StreetSecondary显式伴随对象,以重新获得所有丢失的功能,并替换编译器提供的隐式伴随对象?我想要的不仅仅是tupled恢复的方法.我想要unapply恢复所有功能(例如,包括提取器/ ).
感谢您提供的任何指导/指导.
更新1
我已经做了足够的搜索来发现几件事:
A)必须在其案例类之前定义显式伴随对象(至少在Eclipse Scala-IDE工作表中就是这种情况,并且代码在IntelliJ IDE的工作表中不起作用,无论哪个先出现).
B)有一个强制tupled工作的技术技巧(谢谢drstevens):(StreetSecondary.apply _).tupled虽然这解决了特定的tupled方法问题,但它仍然没有准确或完整地描述scala编译器在隐式伴随对象中提供的内容.
C)最后,可以定义显式伴随对象以扩展与主构造函数的参数的签名匹配的函数,并返回案例类的实例.它看起来像这样:
object StreetSecondary extends ((String, Option[String]) => StreetSecondary) {
//empty for now
}
Run Code Online (Sandbox Code Playgroud)
同样,我仍然不能准确或完整地描述scala编译器在隐式伴随对象中提供的内容.
是否有Scala库API方法(如果不是,惯用方法)获取更大字符串(源)中子字符串(目标)的所有索引的列表?我试图浏览ScalaDoc,但无法找到任何明显的东西.有很多方法可以做很多有用的事情,我猜我只是没有提交正确的搜索条件.
例如,如果我有一个源名称为"name:Yo,name:Jim,name:name,name:bozo",我使用的是"name:"的目标字符串,我想找回一个List [Int]列表(0,8,17,27).
这是我快速解决问题的方法:
def indexesOf(source: String, target: String, index: Int = 0, withinOverlaps: Boolean = false): List[Int] = {
def recursive(index: Int, accumulator: List[Int]): List[Int] = {
if (!(index < source.size)) accumulator
else {
val position = source.indexOf(target, index)
if (position == -1) accumulator
else {
recursive(position + (if (withinOverlaps) 1 else target.size), position :: accumulator)
}
}
}
if (target.size <= source.size) {
if (!source.equals(target)) {
recursive(0, Nil).reverse
}
else List(0)
}
else Nil
}
Run Code Online (Sandbox Code Playgroud)
任何指导,你可以给我用适当的标准库入口点替换它将非常感谢.
更新2014/Jul/22:
受Siddhartha …
我刚刚收到了一堆CSV(逗号分隔值)格式的杂乱数据文件.我需要对数据集进行一些正常的清理,验证和过滤工作.我将在Scala(2.11.7)中进行清理.
在我寻找两个方向的解决方案,输入解析和输出组合时,我发现大多数不明智的切线,包括来自" Scala Cookbook "的切线,在输入解析方面.而且大多数人专注于非常错误的解决方案"使用String.split(",")"以获得CSV线作为List[String].我在作曲输出方面几乎找不到任何东西.
什么样的漂亮的简单的Scala代码片段存在这很容易做到上述CSV往返? 我想避免导入整个库只是为了获取这两个函数(目前我的业务需求使用Java库不是一个可接受的选项).
我有一些计件工作由不同的自定义(源代码不可用)框架完成,这些框架可以传回Map实例.不幸的是,这些框架在返回的Map实例中并不一致,这些实例已用Collections.unmodifiableMap包装.为了确保在我的代码中更高程度的不变性(为了更容易的多线程使用),我在这些框架返回的任何内容上统一调用了Collections.unmodifiableMap.
Map<String, Record> immutableMap = framework.getRecordsByName();
//does this created a nested set of unmodifiableMap wrapper instances?
this.immutableField = Collections.unmodifiableMap(immutableMap);
.
.
.
Map<String, Record> maybeImmutableMap = framework.getRecordsByName();
//is there some means to get instanceof to work?
if (!(maybeImmutableMap instanceof Collections.UnmodifiableMap))
{
this.immutableField = Collections.unmodifiableMap(maybeImmutableMap);
}
Run Code Online (Sandbox Code Playgroud)
我意识到在这部分设计中我可能会遇到性能问题.在某些情况下,我正在调用Collections.unmodifiableMap传递一个实例,该实例已经由同一个调用的框架包装.而且我的重新包装可能会在整个实例中引起额外的方法调用.
似乎使用"instanceof Collections.UnmodifiableMap"不起作用.如果我当前引用的Map实例需要被包装,我找不到任何检测方法(不包括在这种情况下不是选项的反射 - 方式太慢).
问题:
使用Spark 2.1(在Databricks上),我有一个表,它有一个String类型的列,作为从.CSV文件导入的结果.在针对该表的SELECT查询中,我试图在数学运算中使用列值之前将该列的值转换为整数.我一直无法找到正确的Spark SQL"功能"来执行此操作.
下面是SQL的一个示例."TO_NUMBER"不适用于两个字符串中的任何一个; Sum_GN_POP或Count1:
SELECT name AS geohashPrefix3, TO_NUMBER(Sum_GN_POP) AS totalPopulation, TO_NUMBER(Count1) AS landMass
FROM wayne_geohash3
WHERE (LENGTH(name) = 3)
Run Code Online (Sandbox Code Playgroud)
如果我能找到相关的文档,将会很有帮助.我也希望与其他类型进行其他类型的转换(或演员表).非常感谢任何一个或两个的指导.
我无法找到一种方法来提供一个空(无操作)方法来完成以下Scala代码中的catch块:
var autoCloseables: List[AutoCloseable] = List()
... //some code that fills the list with various java.sql.* instances; Connection, Statement, ResultSet
autoCloseables.map(try {_.close} catch {case se: SQLException => NoOp} )
Run Code Online (Sandbox Code Playgroud)
我试图NoOp用" ()"," Unit"," None"," se.getMessage()"等替换" " .我继续在Eclipse中收到错误,说明各种形式的"类型不匹配;发现:单位,必需:AutoCloseable =>?".
我也尝试将最后一行改为下面,但仍然收到与上述相同的警告:
autoCloseables.map(try {_.close} catch {case _: Throwable => } )
Run Code Online (Sandbox Code Playgroud)
任何具体的指导将非常感谢.而且,我了解ARM库.现在,请假设我无法使用它,并且需要从这个特定问题构成框架中解决的问题.谢谢.
在IntelliJ(版本:2016.3.1,Scala插件版本:2016.3.5)中,我有一个Scala 2.12(这意味着需要Java 1.8)项目,我选择"Build/Rebuild Project".我在"消息"窗口中收到以下输出:
Warning:scalac: there were four deprecation warnings (since 2.12.0); re-run with -deprecation for details
我必须采取哪些步骤来配置我的项目,以便我能够真正看到4个警告的内容?
我发现了IntelliJ 14的另一个问题,它显示了如何打开弃用警告,但没有说明如何显示弃用警告本身的实际内容.任何有关这方面的指导将不胜感激.
Josh Sueresh撰写的新曼宁着作"Scala in Depth"的第2章发布在这里.在阅读这篇文章时,我遇到了一些代码:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
tmpArg.map(name => new java.io.File(name)).
filter(_.isDirectory).
getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")))
}
Run Code Online (Sandbox Code Playgroud)
解释上述代码的后续文字如下:
getTemporaryDirectory方法将命令行参数作为包含String的Option,并返回引用我们应该使用的临时目录的File对象.我们要做的第一件事是使用Option上的map方法创建一个java.io.File(如果有参数).接下来,我们确保这个新构造的文件对象是一个目录.为此,我们使用过滤方法.这将检查Option中的值是否遵循某个谓词,如果不是,则转换为None.最后,我们检查选项中是否有值; 否则,我们返回默认的临时目录.
所以,对于我来自Java和学习Scala,代码语法让我很困惑.我不知道map(...)函数调用后面有一个点.似乎有很多类型推断发生,我在某处遗漏某些东西而没有看到类型.
对我来说,学习Scala,能够以某种方式查看所有推断的类型,以取消(或取消应用)所有减少,即看起来类似于Java 6之前的类型具有类似的类型的过于冗长的版本将非常有用.要在集合类的等于两边显示.
是否有任何工具可以采用Scala代码片段并使显式不同的东西(可能作为标志;一个用于类型,另一个用于implicits,另一个用于括号,另一个用于分号).我只需要一些东西让我从完全简洁的代码转到更接近Java的东西,这样我就可以自信地在阅读(并最终编写)更简洁的Scala时掌握我的技能.
这就是我要找的东西:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
ContainerType1[Type1] t1 = tmpArg.map(name => new java.io.File(name));
ContainerType2[Type2] t2 = t1.filter(_.isDirectory);
return t2.getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")));
}
Run Code Online (Sandbox Code Playgroud)
我并没有特别坚持上述内容.我只是无法跟踪链接函数调用如何根据类型推断实际发生的事情.任何有关这方面的帮助将不胜感激.
我定义了以下代码(在Scala IDE/Scala工作表中使用Scala 2.10):
object WorkSheet1 {
object A {
def apply(s: String, huh: Boolean = false): A = A(s)
}
case class A (s: String)
//case class A private (s: String)
val a = A("Oh, Hai")
}
Run Code Online (Sandbox Code Playgroud)
我成功收到以下输出:
a:public_domain.WorkSheet1.A = A(哦,海)
但是,当我注释掉现有的case class A (s: String)并取消注释掉另一个(包含" private ")时,我收到以下编译器错误:"在对象WorkSheet1中无法访问类A中的构造函数A".
我的理解是,一个伴侣对象可以访问它所有的伴侣类的私有部分.嘿.呃......说真的.是什么赋予了?
我正在尝试使用Eclipse Scala-IDE for 2.11(从网站下载预先打包的包).我一直在使用Scala工作表来处理返回JSON的SaaS API.我一直在推动使用String方法.我决定开始使用json4s.我去了http://mvnrepository.com/并获得了以下库:
我已将所有三个罐子添加到Project的Build Path中.它们出现在该项目的"参考图书馆"之下.
我在Scala工作表中有以下代码:
package org.public_domain
import org.json4s._
import org.json4s.native.JsonMethods._
object WorkSheet6 {
println("Welcome to the Scala worksheet")
parse(""" { "numbers" : [1, 2, 3, 4] } """)
println("Bye")
}
Run Code Online (Sandbox Code Playgroud)
我收到以下两个编译错误:
当我查看json4s-core-2.11-3.2.10.jar文件中的org.json4s包时,实际上没有.class文件指示任何类型的编译对象JsonAST.
这是一个表现.任何有关这方面的帮助将不胜感激.
我有一些代码滥用Double的方式与String被滥用作为无类型类型的goto的方式大致相同.Double以这种方式使用会导致许多细微和/或隐藏的问题,通常会导致有害的运行时错误.这就是现在两种方法的样子:
object Geospatial {
def calculateDistance(
coordinate1Longitude: Double,
coordinate1Latitude: Double,
coordinate2Longitude: Double,
coordinate2Latitude: Double
): (Double, Double, Double) = {
//code encapsulated here only works with meters and radians
//returns (distance in meters, initial bearing in zero-based radians, final bearing in zero-based radians)
???
}
def calculateCoordinate(
coordinate1Longitude: Double,
coordinate1Latitude: Double,
angle: Double,
distance: Double
): (Double, Double) = {
//code encapsulated here only works with meters and radians
//returns angle in …Run Code Online (Sandbox Code Playgroud) scala ×11
java ×3
map ×2
angle ×1
apache-spark ×1
case-class ×1
casting ×1
collections ×1
constructor ×1
csv ×1
eclipse ×1
indexof ×1
instanceof ×1
json ×1
memoization ×1
option ×1
parsing ×1
scala-ide ×1
sql ×1
string ×1
try-catch ×1
unmodifiable ×1