小编Ste*_*haw的帖子

是'forM_`惯用的Haskell?

我倾向于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_似乎不是惯用的,但使用似乎很笨拙.有没有惯用的方法来重写这段代码?

haskell

6
推荐指数
1
解决办法
249
查看次数

F#有办法打印表达式的类型吗?

我正在寻找道德等同于ghci:

Prelude> :t 1 + 2
1 + 2 :: Num a => a
Run Code Online (Sandbox Code Playgroud)

f#

5
推荐指数
1
解决办法
750
查看次数

什么是堆栈的默认模板?

如果不指定模板,默认设置是什么?

即在运行命令时stack new foo.

haskell haskell-stack

5
推荐指数
1
解决办法
808
查看次数

这里有什么与scala.collection.immutable.Stack.+ :(前置)?

我注意到不可变堆栈的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)

scala

4
推荐指数
1
解决办法
124
查看次数

命名 v 未命名数据类型参数

在《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)

该定义可以与最初的定义类似地使用。 …

idris

4
推荐指数
1
解决办法
162
查看次数

推入+主推与推推

当我与分叉的GitHub上的上游项目重新同步时,我认为我需要强制执行推送。但是,将其推入+master似乎也有效。

之间有什么区别:

git push origin +master
Run Code Online (Sandbox Code Playgroud)

git push --force origin master
Run Code Online (Sandbox Code Playgroud)

一个危险性低于另一个危险性吗?

git github

3
推荐指数
1
解决办法
434
查看次数

如何用SBT优雅地组成两个任务?

我想转换这个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)

有任何想法吗?

sbt

3
推荐指数
1
解决办法
213
查看次数

什么是函数的右/左反?

Benjamin Pierce在他的"软件基础"一书中指出了这一点

该函数split是正确的逆combine

这里splitunzipcombinezip.我想知道函数的"正逆"是什么意思,如果还有一个左逆zip.

math coq

3
推荐指数
1
解决办法
492
查看次数

在NullPointerException和IllegalArgumentException之间选择,以便在对象构造时发出错误信号

我对Java中的最佳实践有疑问.我正在写一个类,它依赖于构造中的一个对象.实际上,如果在构造中传入的对象为null,则大多数功能都没有意义.我认为最好在对象构造中将null作为参数传递的情况下抛出异常,但我不知道在这种情况下最合适的异常是什么.我应该抛出NullPointer,IllegalArgument,Instatiation,甚至是Initialization异常.

我已经看到这些都在整个Java源代码库中使用,我似乎无法区分为什么在某些情况下使用NullPointer而在其他情况下使用IllegalArgument.我个人会认为如果在构造中传递了错误的参数,则应该发生一些初始化错误.

java exception nullpointerexception

1
推荐指数
1
解决办法
167
查看次数

当x和xs是静态已知时,证明不是(Elem x xs)

使用Idris类型驱动开发的第9章中,我们将介绍Elem带有构造函数的谓词,HereThere证明元素是向量的成员.例如

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)

theorem-proving idris

1
推荐指数
1
解决办法
119
查看次数

自我演员挂在repl

我正在遵循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?

scala actor

0
推荐指数
1
解决办法
170
查看次数