小编Ele*_*fee的帖子

如何在Scala中实现OCaml/F#的"函数"构造?

我在Scala中发现的一种常见趋势是这样的:

def someFunction(a: SomeClass) = a match { ... }
Run Code Online (Sandbox Code Playgroud)

从那以后a永远不再使用.这种模式在FP中很常见,OCaml和F#有一个内置的构造,让你完全抛弃那个参数.

而不是写这个:

let someFunction a = 
  match a with
  | 0 -> true
  | _ -> false
Run Code Online (Sandbox Code Playgroud)

你可以简单地写一下:

let someFunction =
  function
  | 0 -> true
  | _ -> false
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是否有可能在Scala中写这样的东西?

def someFunction = function {
  case 0 => true
  case _ => false
}
Run Code Online (Sandbox Code Playgroud)

保存其他不必要的参数.

我试图把它写成一个带有call-by-name参数的函数,但是Scala不会让我创建一个空match块.

可能吗?或者scala可能已经内置了这样的东西?

f# ocaml scala pattern-matching

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

Scala会自动换字段吗?

曾经有人告诉我,所有公共领域,根据语言的性质自动包装在吸气剂和制定者中.而且我相信,直到我在IDEA的intellisense中检查了那种.

所以说我们有一个简单的课程

class Something {
  val a = 5
}
Run Code Online (Sandbox Code Playgroud)

然后写(new Something).IDEA将显示a为一个值.

然而,相反,在Eclipse中执行完全相同的操作,a将显示为a def,这使我成为这里的围栏.

哪一个是正确的?值是否在编译时包含在函数中,而IDEA只是令人困惑?或者它只是一个价值/变量,我一直都弄错了?

variables scala properties

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

迭代Option实例,直到找到第一个非空

我有许多返回Option值的函数,就像这样

case class A()
case class B() 
case class C()

def optionA(): Option[A] = None
def optionB(): Option[B] = Some(B())
def optionC(): Option[C] = Some(C())
Run Code Online (Sandbox Code Playgroud)

我想要做的是,我想按顺序运行这些函数,但只有在其中一个函数返回Option带有值(a Some)的函数之前.然后我希望返回该值,而不运行其余的函数.

这是我目前的实施

val res:Option[Any] = Stream(
  () => optionA(),
  () => optionB(),
  () => optionC()
) .map(f => f())
  .filter(opt => opt.isDefined)
  .head
Run Code Online (Sandbox Code Playgroud)

对于上述功能的实现,适用optionAoptionB,给了我一个Some(B()),而且也从未运行optionC,这是我想要的.

但我想知道是否有更好/简单/替代的实施.

有点像val findFirst = optionA compose optionB compose optionC

functional-programming scala

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

Haskell:将列表列表中的所有内容包装为一个元素列表的列表

今天是个好日子.

我想要完成的是将列表转换 [ [1, 2, 3], [25, 24, 23, 22], [13] ][ [1], [2], [3], [25], [24], [23], [22], [13] ].

我试过类似的东西

reWrap :: [[a]] -> [[a]]
reWrap data = map (map (:[])) data
Run Code Online (Sandbox Code Playgroud)

但当然它只是把内容包裹得更深.我是功能编程的新手,所以任何帮助或提示都会非常感激.先感谢您!

haskell list sublist

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

Scala如何处理递归返回类型?

在OCaml中有一个名为'rectype'的东西,它允许递归返回类型.为了说明我的意思,这是一个具有这种类型的方法:

def foo(n: Int)(i: Int): ??? = {
  val m = n + i
  (foo(m), m)
}
Run Code Online (Sandbox Code Playgroud)

问题是; 你把它放在什么???地方?查看代码,你会认为它是这样的:

Int => Int => (Int => (Int => (Int => (Int => ... , Int)
Run Code Online (Sandbox Code Playgroud)

为什么?因为类型的foo(m)Int => (Int => rep, Int),其中rep在元组是重复结构.

有没有办法做到这一点?

recursion scala

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

"无法在展平函数中证明Object <:<Try [U]"

我有一个Map可能有一个相同类型的嵌套地图.每个嵌套映射都有一个返回外部映射的引用.

我已经定义了一个findValue查看当前地图的方法,如果找不到任何内容,则会转到其父级,依此类推,直到找到null最外层的父级SymbolTable.

我把这种行为成Try,这样我可以匹配SuccessFailure; 但是为了避免使用类型a-la,Try[Try[Try[ ... Try[TableVaue]... ]]]我将输出平坦化.

在尝试呼叫时,flatten我收到以下错误:Cannot prove that Object <:< Try[U]

以下是相关的代码:

class SymbolTable(val parentScope: SymbolTable) {
  type TableValue = (TypeInfo, Option[Expression], Option[SymbolTable])

  private val contents: mutable.Map[String, TableValue] = mutable.Map.empty

  private def findValue(key: String): Try[TableValue] = Try {
    if (contents contains key) contents(key)
    else parentScope findValue key
  }.flatten
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何在没有对我的代码进行任何重大重构的情况下完成这项工作?

scala implicit-typing

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

不能使用unicode字符作为符文

似乎golang不支持其符文的所有unicode字符

package main

import "fmt"

func main() {
  standardSuits := []rune{'??', '??', '??', '??'}
  fmt.Println(standardSuits)
}
Run Code Online (Sandbox Code Playgroud)

生成以下错误:

./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '?'
./main.go:6: syntax error: unexpected ?, expecting comma or }
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '?'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '?'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '?'
./main.go:6: missing '
./main.go:6: too many errors
Run Code Online (Sandbox Code Playgroud)

有没有办法绕过这个,或者我应该忍受这个限制并使用其他东西?

unicode go rune

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

中缀符号有时在scala中不起作用,为什么会这样?

好吧,所以我正在做一些测试来熟悉Scala,并且想看看我是否可以制作列表Java风格而不是你在Scala中做的奇特方式...

我知道你可以这样做:val lst = List.range(0, 100, 1)但我只想看看scala中的java风格

好吧,这就是我的所作所为:

var lst = List[Int]()

for(i <- 0 until 100) {
    lst = lst :: i // here's where it complains
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,scala,或者至少是eclipse的scala ide不喜欢我使用中缀符号附加,a-la lst :: i它希望我这样做:lst.::(i)否则它说::没有定义或什么,它不是第一个它发生的时间要么......

那么这里的任何人都可以解释它为什么这样做,或者它只是在eclipse中执行不良的情况,因此我必须忍受

scala list

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

什么是<| 在F#?

在F#中,你有一个反向管道运算符<|,就像它的兄弟一样,它将|>参数传递给函数...

现在我已经理解了拥有的好主意|>,让程序员轻松看到受影响的值而不必通过一系列嵌套函数调用是非常棒的,看起来很漂亮:

let newList = someList
                |> List.map (fun x -> x * 3)
                |> List.filter (fun x -> x > 12)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果函数被调用,那么有funcName param什么意义funcName <| param呢?

我也看过一些这样的写函数func1 <| value |> func2到底是做什么的?

parameters f#

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

斯卡拉蛋糕模式

我试图将我对蛋糕模式的理解转换为简单的scala代码,并发现它没有编译.有人可以看看下面的代码,并告诉我这是什么方式我理解模式的问题?我读了这篇文章并尝试了类似的东西(http://www.cakesolutions.net/teamblogs/2011/12/19/cake-pattern-in-depth)

在下面的代码中 - println("This is " + userServiceComponent.whatCalc1) //> This is ()我期待它打印This is ScifiCalc Calc但是它的打印This is ()

码:-

trait Calc {
  def whatCalc
}

trait NormalCalc extends Calc {
  def whatCalc = new String("Normal Calc")
}

trait ScifiCalc extends Calc {
  def whatCalc = new String("ScifiCalc Calc")
}

trait TestTrait{
  def whatCalc1
}

trait TestCalc extends TestTrait {  
  this: Calc =>;

  def whatCalc1 = {
    whatCalc
  }
}

object SelfReferenceExample {
  println("Welcome to the …
Run Code Online (Sandbox Code Playgroud)

scala cake-pattern

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