我开始与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()方法.),但我不确定这一点.
试图为链表实现一个超级简单的计数方法,但是当我尝试匹配我的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) 通过一些代码阅读我有时会遇到一些前缀类型类Monad,它们的实例是MonadState,MonadIO,MonadReader,等.
这些目的究竟是什么?
以MonadState为例,我知道,
State 允许无国籍状态StateT允许使用其他的单子,喜欢IO以"结合"两者的功能但是MonadState允许到底是什么?
我不需要另外一组类似命名的类型/类型类,有人可以解释一下吗?
在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) 我正在编写一个简单的解析器,它使用 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) 可能是另一个愚蠢的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以无效的方式使用,闭包不能捕获可变变量
这是为什么?我能做些什么来让我改变它?
我的问题在于我有一个采用可变数量参数的方法.
这些参数中的每一个都是一个对象,真正的问题在于new ClassName(p1, p2)为该方法中的每个参数写入非常冗长.
有没有办法发送p1和p2作为单个参数的形式{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) 我试图让在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#做这个对我来说是新的
这是例外的确切词:

我想我现在已经尝试了一切......
我一直在堆栈溢出,我甚至咨询了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:只有通过导航到确切的文件路径,手动,然后复制所述路径,我才能访问该文件......但是,我非常想知道我能做些什么来使这个过程更加轻松...
不知道我是否应该在这里或程序员那里问这个问题,但无论如何
在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?