我知道Haskell的
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
Run Code Online (Sandbox Code Playgroud)
可以用Scala表示为
for {
x <- List(1, 2, 3)
y <- List(7, 8, 9)
z = x + y
} yield z
Run Code Online (Sandbox Code Playgroud)
但是,特别是与单子,哈斯克尔往往有内部语句do不对应于任一块<-或=.例如,这里有一些来自Pandoc的代码,它使用Parsec来解析字符串中的某些内容.
-- | Parse contents of 'str' using 'parser' and return result.
parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a
parseFromString parser str = do
oldPos <- getPosition …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Parsec将用Haskell编写的语法翻译成Scala的解析器组合器.
实际匹配表达式的翻译非常简单,至少在我看来,在Scala中更容易一些.对我来说一点都不清楚的是如何处理Parsec使用monad传递的状态.
Scala解析器读入Input并生成ParseResult [T].
相反,Haskell中的GenParser读入输入和状态并生成另一个解析器.在Scala中传递这种状态令我感到困惑.
有没有人在Scala中有一个状态解析的例子,他们愿意分享?
这个问题可能很愚蠢,但我找不到一个例子,也无法弄明白.
我想Person按顺序比较两个类的最后,第一和中间名.这是做死脑筋的方法:
def compare(that: Person): Int = {
val last: Int = lastName.compare(that.lastName)
if (last != 0) last
else {
val first: Int = firstName.compare(that.firstName)
if (first != 0) first
else middleName.compare(that.middleName)
}
Run Code Online (Sandbox Code Playgroud)
我知道有一些更聪明的方法(可能使用Ordering),但我不能把手指放在上面.
托德
一旦我意识到如何在订购中访问正确的东西,我就想出了这一点.
def compare(that: Person): Int = {
Ordering.Tuple3(Ordering.String, Ordering.String, Ordering.String).compare(
(lastName, firstName, middleName),
(that.lastName, that.firstName, that.middleName))
}
Run Code Online (Sandbox Code Playgroud)
我很确定我能用更少的语言来逃避,但这种方法很有效,并且相当紧凑.
我想要使用我正在编写的一些图像处理代码,所以我想使用Scala控制台或BlueJ的Java CodePad之类的东西创建一个java.awt.Image,然后将其弹出来查看.
理想情况下,它只是一个面板或没有框架的东西会出现,我可以点击它让它消失.有没有办法制作轻量级的东西,还是我真的需要某种框架和更多的脚手架?
我的一个高中生和我将尝试将一个Haskell的Parsec解析器组合库移植到Scala中.(它比Scala的内置解析库更有优势,你可以相当容易地传递状态,因为所有的解析器都是monad.)
我遇到的第一个故障是试图弄清楚Functor在scalaz中的工作原理.有人可以解释如何转换此Haskell代码:
data Reply s u a = Ok a !(State s u) ParseError
| Error ParseError
instance Functor (Reply s u) where
fmap f (Ok x s e) = Ok (f x) s e
fmap _ (Error e) = Error e -- XXX
Run Code Online (Sandbox Code Playgroud)
进入Scala(我假设使用Scalaz).我得到了
sealed abstract class Reply[S, U, A]
case class Ok[S, U, A](a: A, state: State[S, U], error: ParseError)
extends Reply[S, U, A]
case class Error[S, U, A](error: ParseError) extends Reply[S, U, A]
Run Code Online (Sandbox Code Playgroud)
并知道我应该Reply扩展这个scalaz.Functor …
Haskell有这个很酷的通用遍历,可以让你map在集合中的每个节点上调用类似的东西,无论是自下而上还是自上而下.它被调用everywhere,你会做类似的事情,everywhere f tree并且f会在树中的每个节点上调用.
在Scala中编写等效的东西Traversable很简单,但Haskell也可以在元组和等效的case类上工作,或者更通用的是Scala调用Product的东西.
您可以遍历Product使用该productIterator方法的元素,但是一旦您知道构造函数的参数(实际上,我猜apply方法)应该是什么,有一些简单的方法将元组或案例类重新组合在一起吗?
def mapOnProduct[X](f: X -> X, prod: Product) {
val newArgs = prod.productIterator.map {
case x: X => f(x)
case id => id
}.toList
[?].apply(newArgs: _*)
}
Run Code Online (Sandbox Code Playgroud)
有什么可以替代[?],以便有机会工作?
谢谢!
我好像找到了一条奇怪的错误信息.我正在存储密码,我有一条评论说
/** A password hash is stored as `"algorithm$iterations$salt$hash"`
* with the number of iterations optional for some algorithms
Run Code Online (Sandbox Code Playgroud)
当我尝试为我的项目创建一个分发jar时,我收到了这个警告:
Variable iterations undefined in comment for...
Run Code Online (Sandbox Code Playgroud)
我跟踪了特征的警告package scala.tools.nsc.ast.DocComments,在那里我发现显然可以在ScalaDoc中放置某种变量.不幸的是,谷歌搜索"Scaladoc中的变量"或"ScalaDoc美元符号"没有任何用处.
有没有人知道我使用的功能不正确以及如何在不收到警告的情况下在ScalaDoc注释中包含美元符号?
我正在为介绍性编程学生编写一个图像库.(我从DrRacket的图像库中偷走了这个想法和模式.)
https://github.com/dupontmanualhs/dm-image
它主要用Swing编写(这是master分支),但我试图将其转换为ScalaFX(参见scalafx分支),并且存在一些问题.理想情况下,学生应该能够做以下事情:
scala> import org.dupontmanual.image._
scala> TrainEngine.display()
Run Code Online (Sandbox Code Playgroud)
并有一个显示火车引擎的对话框.我已经尝试过使用代码了
https://github.com/scalafx/ScalaFX-Tutorials
在stand-alone-dialog项目中,但如果我System.exit(0)在我之后包含dialog.showAndWait(),我会收到此错误:
Not interrupting system thread Thread[process reaper,10,system]
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at com.sun.glass.utils.Disposer.run(Disposer.java:69)
at java.lang.Thread.run(Thread.java:744)
Not interrupting system thread Thread[Prism Font Disposer,10,system]
Exception in runnable
Exception in thread "JavaFX Application Thread"
Run Code Online (Sandbox Code Playgroud)
(请注意,如果我尝试在控制台中运行Appfrom ,我会得到相同的错误stand-alone-dialog,因此我猜测System.exit(0)在SBT控制台中调用不是一个好主意.)
如果我离开这System.exit(0)条线路,那么事情似乎也很好 - 大多数情况下.在我第一次显示对话框后,它不会使对话框成为焦点,因此我必须单击它才能关闭对话框.但真正的问题是,当我:q退出控制台时,SBT挂起,我必须Ctrl-C能够再次打字.(并且,是的,Ctrl-C完全退出SBT,而不仅仅是控制台.)
我想我可能需要做的是专门为ScalaFX创建一个线程.例如,我有一种方法可以将一个图像堆叠在另一个图像的顶部, …
repr在scala中是否存在等效的Pythons 函数?
即一个函数,你可以给任何scala对象,它将产生一个有效的scala代码的对象的字符串表示.
例如:
val l = List(Map(1 -> "a"))
print(repr(l))
Run Code Online (Sandbox Code Playgroud)
会生产
List(Map(1 -> "a"))
Run Code Online (Sandbox Code Playgroud) 我是一名高中老师,我正在使用Scala教我的编程课程.这有点可怕,但我很兴奋.
但是,由于这些是初学者,我想尽可能简单地给它们一个项目结构.一开始,一切都只是在顶层,而在一开始,一切都可能在一个.scala文件中.
不幸的是,我无法弄清楚如何说服Eclipse的,我不想src/main/scala,src/test/scala等并没有出现错误.到目前为止,这是我在build.sbt上最好的破解:
scalaSource in Compile <<= baseDirectory
scalaSource in Test <<= baseDirectory
resourceDirectory <<= baseDirectory
unmanagedSourceDirectories in Compile <<= Seq(scalaSource in Compile).join
unmanagedSourceDirectories in Test <<= Seq(scalaSource in Test).join
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我运行eclipse并刷新时,Eclipse抱怨构建路径中有重复的条目,并且它无法链接到基目录 - 它表示为项目目录的绝对路径,但用连字符替换为斜杠.
我可以手动修复Eclipse项目,但如果我能弄清楚如何不这样做,那就太好了.