小编Ral*_*lph的帖子

Scala保护对象

在Scala中,如果我创建了一个对象和伴随类,protected如果导入了对象,则可以从类中访问使用修饰符声明的标识符:

object Foo {
  protected val X = 42
}
class Foo {
  import Foo._
  def getX(): Int = X
}
Run Code Online (Sandbox Code Playgroud)

但是,protected无法从类Foo的子类访问标识符:

class Bar extends Foo {
  import Foo._
  def getX(): Int = X * 2
}
Run Code Online (Sandbox Code Playgroud)

我得到一个编译时错误Bar.

其他(隐含的)public,是否有任何访问修饰符,我可以X从它的伴侣的子类访问它,但不能从其他类,包括同一个包中的其他类访问?

scala protected

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

Clojure宏扩展

为什么

(macroexpand '(.. arm getHand getFinger))
Run Code Online (Sandbox Code Playgroud)

扩展到

(. (. arm getHand) getFinger)
Run Code Online (Sandbox Code Playgroud)

(macroexpand '(-> arm getHand getFinger))
Run Code Online (Sandbox Code Playgroud)

扩展到

(getFinger (clojure.core/-> arm getHand))
Run Code Online (Sandbox Code Playgroud)

换句话说,为什么->第二个例子没有完全扩展呢?

macros clojure

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

Clojure"DSL"编程

我正在使用Clojure和RESTEasy设计JAX-RS REST服务器.

我的理解是,用Lisp族语言编写的应用程序比"传统"命令式语言中的应用程序更多地构建为"特定于域的语言".应用程序从下到上设计为越来越"精致"的功能,直到"顶层"应用程序成为对高级功能的一系列函数调用.

我试图为我的REST服务器执行此操作,从服务URL请求的资源类开始(GET,POST,PUT,DELETE).

这是我的第一个资源:

(ns com.example.server.resources.buildtime
  (:import [javax.ws.rs CookieParam GET Produces Path]
           [javax.ws.rs.core Context Cookie NewCookie Response UriInfo]
           [org.jboss.resteasy.annotations.providers.jaxb Formatted]))

(definterface BuildTime
  (getBuildTime [^javax.ws.rs.core.UriInfo info
                 ^javax.ws.rs.core.Cookie security-cookie]))

(deftype
  ^{Formatted true}
  BuildTimeResource []
  BuildTime
  (^{GET true
     Path "/buildtime"
     Produces ["application/json"]}
    getBuildTime
    [this info security-cookie]
    (.. (Response/ok "20111009") build)))
Run Code Online (Sandbox Code Playgroud)

当使用GET http方法在URL"/ buildtime"调用时,此资源将服务器构建时间作为String(包含在JSON包中)返回.

我将编写更多这些资源类和封闭方法(大多数类将有多个方法),每个都有一个definterface和一个deftype.这似乎是宏的完美用法.

我正在征求关于如何以DSL方式完成这项工作的建议.如何根据DSL进行思考?

dsl clojure

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

模式匹配Haskell中的正则表达式模式

在Scala中,我有一个正则表达式模式匹配,如下所示:

val Regex = """(\d{4})/(\d{2})/(\d{2})""".r
val Regex(year, month, day) = "2013/01/06"
Run Code Online (Sandbox Code Playgroud)

结果是:

year: String = 2013
month: String = 01
day: String = 06
Run Code Online (Sandbox Code Playgroud)

如何在Haskell中完成类似的结果?换句话说,我可以匹配包含组的正则表达式并将组分配给标识符吗?

regex haskell pattern-matching

8
推荐指数
2
解决办法
5566
查看次数

在Scala中避免深度嵌套的选项级联

说我有三个数据库访问功能foo,bar以及baz可在每个返回Option[A],其中A一些模型类,并调用互相依赖.

我想按顺序调用函数,并且在每种情况下,如果找不到值,则返回相应的错误消息(None).

我当前的代码如下所示:

Input is a URL: /x/:xID/y/:yID/z/:zID

foo(xID) match {
  case None => Left(s"$xID is not a valid id")
  case Some(x) =>
    bar(yID) match {
      case None => Left(s"$yID is not a valid id")
      case Some(y) =>
        baz(zID) match {
          case None => Left(s"$zID is not a valid id")
          case Some(z) => Right(process(x, y, z))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以看出,代码严重嵌套.

相反,我使用for理解,我不能给出具体的错误信息,因为我不知道哪一步失败了:

(for {
  x <- foo(xID) …
Run Code Online (Sandbox Code Playgroud)

scala nested option scala-cats

8
推荐指数
2
解决办法
1044
查看次数

在Scala中处理可选的xml属性

我有读取XML文件的代码.我需要处理的元素的一些属性是可选的.我正在尝试使用Option [T]来管理它们.我已经写了以下内容来pimp \Node运算符返回的NodeSeq类型:

class NodeSeqWrapper(nodeSeq: NodeSeq) {
  def textOption: Option[String] = {
    val text = nodeSeq.text
    if (text == null || text.length == 0) None else Some(text)
  }
}
implicit def nodeSeqWrapper(nodeSeq: NodeSeq): NodeSeqWrapper =
  new NodeSeqWrapper(nodeSeq)
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

(node \ "@attr").textOption.getOrElse("Some default value")
Run Code Online (Sandbox Code Playgroud)

如果节点具有"attr"属性,则此代码获取其值.如果没有,则返回值"Some default value".

我怎样才能改善这个?有没有办法将类定义折叠到隐式方法中?有没有更好的方法来获取"可选"属性值?我使用Option[T]"正确"吗?

scala option xml-parsing

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

Haskell函数可以反转函数调用

我有一个\x f -> f x正在foldM操作中使用的lambda ,其中x是一个值和f :: a -> b.

是否有内置功能可以做到这一点?

我可以更换吗?

foldM (\x f -> f x) ...
Run Code Online (Sandbox Code Playgroud)

和一些 f'

foldM f' ...
Run Code Online (Sandbox Code Playgroud)

我以为flip会这样做,但需要三个参数(flip :: (a -> b -> c) -> b -> a -> c)

它可能类似于|>F#.

haskell

7
推荐指数
2
解决办法
1924
查看次数

Haskell IO Monad和内存使用

我可能不太了解IO monad.

如果我编写一个预计运行数月的应用程序,同时记录其进度,那么IO monad会将所有日志信息保存在RAM中直到结束吗?

IO Inside的博客中,Haskell将世界塑造为

main :: RealWorld -> ((), RealWorld)
Run Code Online (Sandbox Code Playgroud)

这样在执行代码的Haskell部分期间不会发生IO,但只有在应用程序返回时才会发生main.

我可能完全误解了这一点.有人能解释哈斯克尔实际上做IO?

io monads haskell

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

用"IO"代码中的"Maybe"值重构"阶梯"

以下函数f尝试Int使用IO (Maybe Int)函数两次读取两次,但在成功读取一次后执行"短路"执行Int:

readInt :: IO (Maybe Int)

f :: IO (Maybe Int)
f = do
  n1 <- readInt
  case n1 of
      Just n' -> return (Just n')
      Nothing -> do
        n2 <- readInt
        case n2 of
              Just n' -> return (Just n')
              Nothing -> return Nothing
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法来重构这段代码?如果我将它扩展到三次尝试,这将变得非常毛茸茸......

(我的思维过程:看到这个"staircasing"告诉我,也许我应该使用Monad的情况Maybe,但由于这是已经在IO单子,我将不得不使用MaybeT(),但我只需要?一个readInt来成功,所以Maybemonad在第一次Nothing出错的行为在这里是错误的...)

monads haskell maybe io-monad

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

如何将字符串的 HashSet 转换为向量?

我正在尝试将 a 转换HashSet<String>为一个排序向量,然后可以join用逗号进行编辑:

use std::collections::HashSet;

fn main() {
    let mut hs = HashSet::<String>::new();
    hs.insert(String::from("fee"));
    hs.insert(String::from("fie"));
    hs.insert(String::from("foo"));
    hs.insert(String::from("fum"));

    let mut v: Vec<&String> = hs.iter().collect();
    v.sort();

    println!("{}", v.join(", "));
}
Run Code Online (Sandbox Code Playgroud)

这不会编译:

use std::collections::HashSet;

fn main() {
    let mut hs = HashSet::<String>::new();
    hs.insert(String::from("fee"));
    hs.insert(String::from("fie"));
    hs.insert(String::from("foo"));
    hs.insert(String::from("fum"));

    let mut v: Vec<&String> = hs.iter().collect();
    v.sort();

    println!("{}", v.join(", "));
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么我不能加入Vec<&String>,但我怎样才能将 转换HashSet为 a Vec<String>,以便它可以加入?

在 Rust 中打印由空格分隔的迭代器的惯用方法什么?似乎并不适用,因为迭代器Args返回String值,不像迭代器HashSet返回&String …

vector hashset rust borrowing

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