小编Ele*_*fee的帖子

理解sum函数的实现

我开始与Haskell一起玩,并遇到了以下sum函数的实现:

sum [] = 0
sum (x:xs) = x + sum xs
Run Code Online (Sandbox Code Playgroud)

然后有一个解释,显示函数在一个真实的例子中的行为:

sum [1,2,3]

1 + (sum [2,3])
1 + (2 + sum [3])
1 + (2 + (3 + sum []))
1 + (2 + (3 + 0))
= 6
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么每次sum [x]调用时,列表都会减少1个元素?

我唯一的假设是,当构造(x:xs)执行时,x列表的元素不仅被检索,而且被删除(类似于栈pop()方法.),但我不确定这一点.

haskell

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

无法与案例对象匹配

试图为链表实现一个超级简单的计数方法,但是当我尝试匹配我的case对象的模式时,我得到一个错误.

这是代码:

trait LinkedList[+A] {
  def count = 0
}

case object Leaf extends LinkedList[Nothing]

case class  Node[A](head: A, tail: LinkedList[A]) extends LinkedList[A] {
  override def count: Int = this match {
    case Node(_, t) => 1 + t.count
    case Leaf => 0
  }
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

scala> :load LinkedList.scala
Loading LinkedList.scala...
defined trait LinkedList
defined module Leaf
<console>:17: error: pattern type is incompatible with expected type;
 found   : Leaf.type
 required: Node[A]
Note: if you intended to match against the class, …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching

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

为什么有些类型类以"Monad"为前缀?

通过一些代码阅读我有时会遇到一些前缀类型类Monad,它们的实例是MonadState,MonadIO,MonadReader,等.

这些目的究竟是什么?

MonadState为例,我知道,

  • State 允许无国籍状态
  • StateT允许使用其他的单子,喜欢IO"结合"两者的功能

但是MonadState允许到底是什么?

我不需要另外一组类似命名的类型/类型类,有人可以解释一下吗?

monads haskell

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

使用元组时非法实例声明

在Haskell中徘徊,更加密切地了解类型类,但我遇到了一些障碍.无论出于何种原因,我都不被允许制作我Vector班级的实例.我被告知这是一个非法的实例声明,因为我没有不同的类型变量?这里发生了什么?

class Vector v where
  vplus :: v -> v -> v
  vmult :: Num a => v -> a -> v

instance Num a => Vector (a, a) where
  (a, b) `vplus` (c, d) = (a + c, b + d)
  (a, b) `vmult` m = (a * m, b * m)
Run Code Online (Sandbox Code Playgroud)

haskell typeclass

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

匹配列表中间的子列表

我正在编写一个简单的解析器,它使用 Scala 的模式匹配功能。

然而,可变数量的令牌之后解析一些东西似乎很麻烦。

有没有办法让我做如下事情:

def parse(toks: List[Token]) = toks match {
  case FuncDef :: Id(v) :: LeftParen :: { args } :: RightParen :: Nil => 
    // impl goes here
}
Run Code Online (Sandbox Code Playgroud)

哪里{ args }是子列表。

所以说如果Token列表看起来像这样:

List(FuncDef, Id("foo"), LeftParen, Id("x"), Id("y"), Id("z"), RightParen)
Run Code Online (Sandbox Code Playgroud)

{ args } 然后会匹配 Id("x"), Id("y"), Id("z")

这是可行的,还是我需要去做这个

def parse(toks: List[Token]) = toks match {
  case FuncDef :: Id(v) :: LeftParen :: tail => 
    // impl goes here
} …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching

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

F#函数不允许我改变可变值

可能是另一个愚蠢的F#初学者的问题...但是它一直困扰着我

我似乎无法在网上找到任何答案...可能是'因为我搜索错误的条款,但是呃

无论如何我的代码如下:

let counter() = 
    let mutable x = 0

    let increment(y :int) =
        x <- x + y // this line is giving me trouble
        printfn "%A" x // and this one too

    increment // return the function
Run Code Online (Sandbox Code Playgroud)

Visual Studio告诉我,x以无效的方式使用,闭包不能捕获可变变量

这是为什么?我能做些什么来让我改变它?

variables f# function mutable mutation

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

如何在c#中将两个参数作为一个参数发送?

我的问题在于我有一个采用可变数量参数的方法.

这些参数中的每一个都是一个对象,真正的问题在于new ClassName(p1, p2)为该方法中的每个参数写入非常冗长.

有没有办法发送p1p2作为单个参数的形式{p1, p2}(p1, p2)

所以我可以写Insert(("John", "Doe"), ("Sherlock", "Holmes"), ... etc),然后将这些传递给方法本身的新闻,而不是写Insert(new Person("John", "Doe"), new Person("Sherlock", "Holmes"), ... etc)

我知道F#中的元组和scala可以这样做,但在C#中使用元组只会使代码更长

有没有办法让它变得不那么冗长?

编辑:我不打算创建新数组或新列表,而是希望尽可能避免使用新关键字

Edit2:有些人要求查看我的Insert方法的样子; 目前它看起来像这样:

public void Insert(params Person[] arr)
{
    //inserts the person in a hash table
    Action<Person> insert = (person) => _table[hasher(person.Name)].Add(person);

    // calls the insert function/action for each person in the parameter array
    Array.ForEach(arr, insert);
}
Run Code Online (Sandbox Code Playgroud)

c# parameters tuples

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

F#System.TypeInitializationException ...为什么?

我试图让在F#中使用一个对话框,但是打开一个文件时,我尝试使用它的GUI应用程序,该程序崩溃,除此之外,这里是我的代码:

let openAndDrawChart e = 
    let dlg = new OpenFileDialog(Filter="CSV Files|*.csv")
    if dlg.ShowDialog() = DialogResult.OK then // code crashes here
        let pieChart = drawChart dlg.FileName
        boxChart.Image <- pieChart
        btnSave.Enabled <- true
Run Code Online (Sandbox Code Playgroud)

如果我尝试在它周围尝试阻止,程序只是在"with"关键字后崩溃

此外,如果我用以下代码替换代码then,()那么程序仍会崩溃,代码永远不会超过if ... then语句

那么这里的任何人都知道我做错了什么,以及我如何解决它?

我只是想指出我更习惯于用C#制作gui应用程序,所以试图用F#做这个对我来说是新的

这是例外的确切词:

user-interface f# typeinitializeexception

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

无法将LocalBroadcastManager添加到Android Studio中的项目中

我想我现在已经尝试了一切......

我一直在堆栈溢出,我甚至咨询了android doc

这里的大多数帖子都展示了如何在Eclipse中添加.jar文件"android工具 - >添加支持库"等等

所以我试着通过去build.gradle和添加compile 'com.android.support:support-v4:19.0.0'到doc来告诉我docdependencies

但即使我添加它,并重建项目,我仍然无法导入android.support.v4.content.LocalBroadcastManager...它甚至不知道是什么android.support...

那么有谁可以帮助我吗?问题变得非常烦人,而且它让我减慢了几个小时......

编辑:我已经更新了Android SDK,并确保该库存在于sdk文件夹中,所以我知道它就在那里......我只是因为某种原因无法让android studio添加它...

编辑2:只有通过导航到确切的文件路径,手动,然后复制所述路径,我才能访问该文件......但是,我非常想知道我能做些什么来使这个过程更加轻松...

android android-support-library android-studio build.gradle

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

了解scala中的中缀行为

不知道我是否应该在这里或程序员那里问这个问题,但无论如何

在Scala中,可以使用中缀语法编写方法调用,即省略点和parens.

举个例子,你可以这样做:

lst foreach println // equivalent to lst.foreach(println)
Run Code Online (Sandbox Code Playgroud)

当然人们会认为lst map _.toString会被评估lst.map(_.toString),这相当于lst.map(x$1 => x$1.toString)

但是lst map _.toString进入repl会产生令人惊讶的结果,它被评估为((x$1) => sList.map(x$1.toString))导致方法调用出现故障.

那为什么呢?为什么是它的简单的规则a.f(b)等同于a f b书写时不再适用a f _.b

scala language-theory infix-notation

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