小编Ral*_*lph的帖子

在Scala中定义从字符串到函数的映射

我正在尝试使用键:String,value:定义Map文本(Any)=>String.我尝试了以下,但得到语法错误:

def foo(x: Int): String = /...
def bar(x: Boolean): String = /...
val m = Map[String, (Any) => String]("hello" -> foo, "goodbye" -> bar)
Run Code Online (Sandbox Code Playgroud)

types scala map

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

Scala的Java 7风格自动资源管理

Java 7引入了自动资源管理:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}
Run Code Online (Sandbox Code Playgroud)

这适用于任何实现的类java.lang.AutoClosable.

我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个例子.

是否有计划向Scala添加语言级资源管理,类似于Java try(...) { }

java scala

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

Clojure:从Map分配defrecord字段

关注如何从一系列值中创建记录,如何编写defrecord构造函数调用并从a中分配字段Map,留下未命名的字段nil

(defrecord MyRecord [f1 f2 f3])
(assign-from-map MyRecord {:f1 "Huey" :f2 "Dewey"})  ; returns a new MyRecord
Run Code Online (Sandbox Code Playgroud)

我想可以写一个宏来做这件事.

constructor clojure

10
推荐指数
2
解决办法
3500
查看次数

在Haskell中组合monad

我正在尝试将Spider Solitaire播放器编写为Haskell学习练习.

我的main函数将为playGame每个游戏(使用mapM)调用一次函数,传入游戏编号和随机生成器(StdGen).该playGame函数应该返回一个Control.Monad.Statemonad和一个IO monad,其中包含一个String显示游戏画面并Bool指示游戏是赢还是输的.

如何将Statemonad与IOmonad 结合起来获得返回值?`playGame的类型声明应该是什么?

playGame :: Int -> StdGen a -> State IO (String, Bool)
Run Code Online (Sandbox Code Playgroud)

是对的State IO (String, Bool)吗?如果不是,它应该是什么?

main,我计划使用

do
  -- get the number of games from the command line (already written)
  results <- mapM (\game -> playGame game getStdGen) [1..numberOfGames]
Run Code Online (Sandbox Code Playgroud)

这是正确的打电话playGame吗?

io haskell state-monad

10
推荐指数
2
解决办法
2161
查看次数

Scala的`doto`

Clojure提供了一个调用的宏doto,它接受其参数和函数列表,并基本上调用每个函数,在(计算的)参数前面加上:

(doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2))
-> {a=1, b=2}
Run Code Online (Sandbox Code Playgroud)

有没有办法在Scala中实现类似的东西?我设想了以下形式的东西:

val something =
  doto(Something.getInstance) {
    x()
    y()
    z()
  }
Run Code Online (Sandbox Code Playgroud)

这相当于

val something = Something.getInstance
something.x()
something.y()
something.z()
Run Code Online (Sandbox Code Playgroud)

可能使用scala.util.DynamicVariables?

请注意,使用工厂方法时,Something.getInstance无法使用常见的Scala模式

val something =
  new Something {
    x()
    y()
    z()
  }
Run Code Online (Sandbox Code Playgroud)

scala

10
推荐指数
2
解决办法
409
查看次数

在Haskell中运行并行URL下载

下面是Haskell代码(HTTP)下载给定目录中缺少的文件:

module Main where

import Control.Monad ( filterM
                     , liftM
                     )
import Data.Maybe ( fromJust )
import Network.HTTP ( RequestMethod(GET)
                    , rspBody
                    , simpleHTTP
                    )
import Network.HTTP.Base ( Request(..) )
import Network.URI ( parseURI )
import System.Directory ( doesFileExist )
import System.Environment ( getArgs )
import System.IO ( hClose
                 , hPutStr
                 , hPutStrLn
                 , IOMode(WriteMode)
                 , openFile
                 , stderr
                 )
import Text.Printf ( printf )

indices :: [String]
indices =
  map format1 [0..9] ++ map format2 [0..14] ++ ["40001-41284" :: …
Run Code Online (Sandbox Code Playgroud)

io parallel-processing haskell

10
推荐指数
3
解决办法
2406
查看次数

尾调用优化失败时的Clojure警告/错误

在Scala 2.8.x中,添加了一个新的注释(@tailrec),如果编译器无法对带注释的方法执行尾调用优化,则会产生编译时错误.

在Clojure中是否有类似的设施loop/recur

编辑: 在阅读我的问题的第一个答案(谢谢,Bozhidar Batsov)并进一步搜索Clojure文档后,我发现了这个问题:

(recur exprs*)
按顺序计算exprs,然后并行地将递归点的绑定重新绑定到exprs的值.如果递归点是fn方法,那么它会重新引导params.如果递归点是一个循环,那么它会重新绑定循环绑定.执行然后跳回到递归点.recur表达式必须与递归点的arity完全匹配.特别是,如果递归点是可变参数fn方法的顶部,则不会收集休息参数 - 应该传递单个seq(或null).在尾部位置以外重复是一个错误.

请注意,recur是Clojure中唯一不占用堆栈的循环结构.没有尾调用优化,并且不鼓励使用自调用来循环未知边界.recur是功能性的,它在尾部位置的使用由编译器验证 [强调是我的].

(def factorial
  (fn [n]
    (loop [cnt n acc 1]
       (if (zero? cnt)
            acc
          (recur (dec cnt) (* acc cnt))))))
Run Code Online (Sandbox Code Playgroud)

tail-recursion clojure

9
推荐指数
2
解决办法
678
查看次数

在运行时设置Clojure"常量"

我有一个Clojure程序,我使用Maven构建为JAR文件.嵌入在JAR Manifest中的是构建版本号,包括构建时间戳.

我可以使用以下代码在运行时从JAR Manifest轻松读取:

(defn set-version
  "Set the version variable to the build number."
  []
  (def version
    (-> (str "jar:" (-> my.ns.name (.getProtectionDomain)
                                   (.getCodeSource)
                                   (.getLocation))
                    "!/META-INF/MANIFEST.MF")
      (URL.)
      (.openStream)
      (Manifest.)
      (.. getMainAttributes)
      (.getValue "Build-number"))))
Run Code Online (Sandbox Code Playgroud)

但我被告知def在内部使用是不好的业力defn.

什么是在运行时设置常量的Clojure-idiomatic方法?我显然没有将构建版本信息嵌入到我的代码中def,但我希望它main在程序启动时从函数中设置一次(并且为所有).然后它应该作为def其余运行代码的可用.

更新:BTW,Clojure必须是我在很长一段时间内遇到的最酷的语言之一.感谢Rich Hickey!

runtime constants clojure

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

Clojure中的数据库函数式编程

"如果你拥有的唯一工具是锤子,那就很诱人,把所有东西看作是钉子." - 亚伯拉罕·马斯洛

我需要编写一个工具来将大型分层(SQL)数据库转储到XML.该层次结构由一个的Person与子公司表Address,Phone等表.

  • 我必须转储数千行,所以我想逐步这样做,而不是将整个XML文件保存在内存中.

  • 我想将非纯函数代码隔离到应用程序的一小部分.

  • 我认为这可能是在Clojure中探索FP和并发性的好机会.我还可以向持怀疑态度的同事展示不可变数据和多核利用的好处.

我不确定应用程序的整体架构应该如何.我想我可以使用一个不纯的函数来检索数据库行并返回一个惰性序列,然后可以由返回XML片段的纯函数处理.

对于每一Person行,我可以创建一个Future并且有几个并行处理(输出顺序无关紧要).

当每个Person被处理时,任务将从检索适当的行Address,Phone等等表和生成嵌套XML.

我可以使用通用函数来处理大多数表,依靠数据库元数据来获取列信息,并为需要自定义处理的少数表提供特殊功能.这些功能可以列在一个map(table name -> function).

我是否以正确的方式解决这个问题?我可以轻松地使用Java在OO中执行此操作,但这并不好玩.

顺便说一句,有没有关于FP模式或架构的好书?我有几本关于Clojure,Scala和F#的好书,虽然每个都很好地涵盖了语言,但没有人看过功能编程设计的"大图".

database functional-programming clojure

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

Scala和Clojure中的简单字符串模板替换

下面是用Scala和Clojure编写的函数,用于简单替换字符串中的模板.每个函数的输入String包含表单模板{key}和从符号/关键字到替换值的映射.

例如:

斯卡拉:

replaceTemplates("This is a {test}", Map('test -> "game"))
Run Code Online (Sandbox Code Playgroud)

Clojure的:

(replace-templates "This is a {test}" {:test "game"})
Run Code Online (Sandbox Code Playgroud)

会回来的"This is a game".

输入映射使用符号/关键字,这样我就不必处理字符串中的模板包含大括号的极端情况.

不幸的是,该算法效率不高.

这是Scala代码:

def replaceTemplates(text: String,
                     templates: Map[Symbol, String]): String = {
  val builder = new StringBuilder(text)

  @tailrec
  def loop(key: String,
           keyLength: Int,
           value: String): StringBuilder = {
    val index = builder.lastIndexOf(key)
    if (index < 0) builder
    else {
      builder.replace(index, index + keyLength, value)
      loop(key, keyLength, value)
    }
  }

  templates.foreach {
    case …
Run Code Online (Sandbox Code Playgroud)

string scala clojure

9
推荐指数
5
解决办法
4283
查看次数