我倾向于forM_在Haskell中使用它,就像.each在Ruby或foreachScala中一样.
import Control.Monad (forM_)
import Network.BSD (getHostByName, hostAddresses)
import Network.Socket (inet_ntoa)
import System.Environment (getArgs)
resolve address = do
ent <- getHostByName address
mapM inet_ntoa (hostAddresses ent)
main = do
args <- getArgs
args `forM_` (\address -> do
ips <- resolve address
ips `forM_` (\ip -> putStrLn $ address ++ "\t" ++ ip))
Run Code Online (Sandbox Code Playgroud)
它对我来说mapM_似乎不是惯用的,但使用似乎很笨拙.有没有惯用的方法来重写这段代码?
我注意到不可变堆栈的ScalaDoc引用了一个前缀为以下签名的方法:
class Stack[A+] ...
def +: (elem: A): Stack[A]
Run Code Online (Sandbox Code Playgroud)
该方法签名对我来说看起来不对,因为Stack在A类型参数中是协变的(因此elem的类型应该是编译器错误).更重要的是,Scaladoc说这种方法的定义是在GenSeqLike中,但它似乎并不存在.
SeqLike有+的实现:我想象的是Stack正在使用的那个.
trait SeqLike[+A, +Repr] ...
def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
b += elem
b ++= thisCollection
b.result
}
Run Code Online (Sandbox Code Playgroud)
这看起来不像Stack.push那样有效.
当我尝试提供我自己的+ :(作为push)的实现时,我确实得到了我所覆盖的方法不存在的预期编译器错误以及协方差问题.
class Stack2[+A] extends Stack[A] {
override def +: (elem: A): Stack[A] = this push elem
}
Run Code Online (Sandbox Code Playgroud)
scalac Stack2.scala给出:
Stack2.scala:4: error: method +: overrides nothing
override def +: (elem: A): Stack[A] = this push elem
^
Stack2.scala:4: error: …Run Code Online (Sandbox Code Playgroud) 在《Type Driven Development with Idris》第 6 章的代码中,我对这段代码感到困惑:
data DataStore : Type -> Type where
MkData : (size : Nat) ->
(items : Vect size schema) ->
DataStore schema
Run Code Online (Sandbox Code Playgroud)
我认为它可能无法编译,因为schema似乎未定义,或者至少需要以某种方式与 的第一个参数相关联DataStore。然而,它加载得很好并且可以像这样使用:
*DataStore> the (DataStore String) $ MkData 2 ["Fred", "Wilma"]
MkData 2 ["Fred", "Wilma"] : DataStore String
Run Code Online (Sandbox Code Playgroud)
我认为第一个参数DataStore需要schema像这样命名:
data DataStore : (schema : Type) -> Type where
MkData : (size : Nat) ->
(items : Vect size schema) ->
DataStore schema
Run Code Online (Sandbox Code Playgroud)
该定义可以与最初的定义类似地使用。 …
当我与分叉的GitHub上的上游项目重新同步时,我认为我需要强制执行推送。但是,将其推入+master似乎也有效。
之间有什么区别:
git push origin +master
Run Code Online (Sandbox Code Playgroud)
和
git push --force origin master
Run Code Online (Sandbox Code Playgroud)
?
一个危险性低于另一个危险性吗?
我想转换这个bash表达式:
$ sbt clean lint
Run Code Online (Sandbox Code Playgroud)
进入一个很好的build.sbt表达式,如:
precommit := clean <> lint
Run Code Online (Sandbox Code Playgroud)
这样我就可以运行以下bash表达式:
$ sbt precommit
Run Code Online (Sandbox Code Playgroud)
例如,这或多或少是你用Makefile做的:
lint:
echo linting
touch foo.txt
clean:
echo cleaning
rm -f foo.txt
precommit: clean lint
Run Code Online (Sandbox Code Playgroud)
Makefile可以像:
$ make precommit
echo cleaning
cleaning
rm -f foo.txt
echo linting
linting
touch foo.txt
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Benjamin Pierce在他的"软件基础"一书中指出了这一点
该函数
split是正确的逆combine
这里split是unzip和combine是zip.我想知道函数的"正逆"是什么意思,如果还有一个左逆zip.
我对Java中的最佳实践有疑问.我正在写一个类,它依赖于构造中的一个对象.实际上,如果在构造中传入的对象为null,则大多数功能都没有意义.我认为最好在对象构造中将null作为参数传递的情况下抛出异常,但我不知道在这种情况下最合适的异常是什么.我应该抛出NullPointer,IllegalArgument,Instatiation,甚至是Initialization异常.
我已经看到这些都在整个Java源代码库中使用,我似乎无法区分为什么在某些情况下使用NullPointer而在其他情况下使用IllegalArgument.我个人会认为如果在构造中传递了错误的参数,则应该发生一些初始化错误.
在使用Idris的类型驱动开发的第9章中,我们将介绍Elem带有构造函数的谓词,Here并There证明元素是向量的成员.例如
oneInVector : Elem 1 [1, 2, 3]
oneInVector = Here
twoInVector : Elem 2 [1, 2, 3]
twoInVector = There Here
Run Code Online (Sandbox Code Playgroud)
我想知道如何显示元素不在向量中.它应该是通过提供这种类型的解决方案:
notThere : Elem 4 [1, 2, 3] -> Void
notThere = ?rhs
Run Code Online (Sandbox Code Playgroud)
在这种情况下,表达/证明搜索没有得出答案,给出:
notThere : Elem 4 [1,2,3] -> Void
notThere = \__pi_arg => ?rhs1
Run Code Online (Sandbox Code Playgroud)
扫描库Data.Vect,这些定义看起来很有用(但我不知道如何连接点):
||| Nothing can be in an empty Vect
noEmptyElem : {x : a} -> Elem x [] …Run Code Online (Sandbox Code Playgroud) 我正在遵循Scala版本1 30.3(p589)中的编程.在那里它解释了你可以使用'self'作为当前线程的actor来调试repl中的actor.但是,当我跟随Scala 2.9.1时,线程会在接收时挂起.
$ scala -unchecked -deprecation
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import scala.actors.Actor._
import scala.actors.Actor._
scala> self ! "hi"
scala> self.receive { case a => a }
[hangs - should be "res1: Any = hi"]
Run Code Online (Sandbox Code Playgroud)
我检查Scala 2.7.7,它按预期工作.如何使用Scala 2.9.1?