Haskell中的代数数据类型(ADT)可以通过从它们派生而自动成为某些类型(例如Show,Eq)的实例.
data Maybe a = Nothing | Just a
deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是如何deriving工作的,即Haskell如何知道如何为派生的ADT实现派生类型类的功能?
另外,为什么deriving仅限于某些类型类?为什么我不能编写自己可以派生的类型类?
我已经使用JUnit 4和spring-test库编写了一些JUnit测试.当我在Eclipse中运行测试然后运行正常并通过.但是当我使用Maven运行它们时(在构建过程中),它们无法给出与弹簧相关的错误.我不确定导致问题的是什么,JUnit,Surefire或Spring.这是我的测试代码,弹簧配置和我从Maven获得的异常:
PersonServiceTest.java
package com.xyz.person.test;
import static com.xyz.person.util.FjUtil.toFjList;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import com.xyz.person.bo.Person;
import com.xyz.person.bs.PersonService;
import fj.Effect;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:personservice-test.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class PersonServiceTest {
@Autowired
private PersonService service;
@Test
@Transactional
public void testCreatePerson() {
Person person = new Person();
person.setName("abhinav");
service.createPerson(person);
assertNotNull(person.getId());
}
@Test
@Transactional
public void testFindPersons() {
Person …Run Code Online (Sandbox Code Playgroud) 我在Scala(源代码)(Scala 2.8 RC7)和Clojure(源代码)(Clojure 1.1)中编写了一个环网络拓扑模拟,用于比较Actors和Agents.
虽然Scala版本显示几乎恒定的消息交换率,因为我将网络中的节点数从100增加到1000000,但Clojure版本显示的消息速率随着节点数量的增加而减少.同样在单次运行期间,Clojure版本中的消息速率随着时间的推移而降低.
所以我很好奇Scala的演员如何与Clojure的特工比较?Agent本身是否比Actors更少并发或代码编写效率低(autoboxing?)?
PS:我注意到Scala版本中的内存使用量随着节点数量的增加(100万个节点> 500 MB)而增加很多,而Clojure版本使用的内存要少得多(100万个节点约100 MB).
编辑:
这两个版本都在相同的JVM上运行,并且所有JVM参数和Actor和Agent配置参数都设置为默认值.在我的机器上,Scala版本为100到100万个节点提供了大约5000个消息/秒的消息速率,而Clojure版本以100个节点的60000消息/秒开始,对于100万个节点减少到200个消息/秒.
编辑2
事实证明我的Clojure版本编写效率低下.我将nodes集合的类型更改list为vector,现在它显示了一致的行为:100个节点100000消息/秒,100000个节点80000消息/秒.所以Clojure Agent似乎比Scala Actors更快.我也更新了链接的来源.
Scala中的所有不可变数据结构都是持久的吗?如果不是,哪一个是哪个,哪个不是?那些持久的行为特征是什么?另外,它们如何与Clojure中的持久数据结构进行比较?
忽略本机互操作和瞬态,是否可以在Clojure中创建包含直接循环引用的任何数据结构?
似乎不可变数据结构只能包含对其自身先前版本的引用.是否有任何Clojure API可以创建一个引用自身的新数据结构?
Scheme具有letrec形式,允许创建相互递归的结构 - 但据我所知,Clojure没有任何类似的东西.
这个问题与将Clojure移植到iOS有关 - 它没有垃圾收集,但确实有引用计数.
这应该是一个愚蠢的问题.
scala> val aFloat = 1.5f
aFloat: Float = 1.5
Run Code Online (Sandbox Code Playgroud)
如何以简单的方式将aFloat强制转换为Int?
我已经知道要使用了a.asInstanceOf[Int].但它需要太多的击键.
我一直在学习各种函数式语言,包括Haskell,Scala和Clojure.Haskell有一个非常严格且定义良好的静态类型系统.Scala也是静态类型的.另一方面,Clojure是动态类型的.
所以我的问题是
type-systems programming-languages functional-programming clojure
我正在使用Maven和Tycho构建一个eclipse插件.Tycho通过检查插件的清单文件为Maven生成pom.xml文件.现在清单文件和pom文件都有插件的版本,需要手动保持同步.这是因为我在生成的pom文件中进行了一些自定义,并且每次更改清单中的版本时都无法覆盖它.
我的问题是,有没有办法使用Tycho自动保持这些版本同步?
最近基于Scala的Web框架社区已经有了很多变化.来自Rails,Rake,ActiveRecord和迁移 - 这是一个很好的Scala框架来构建生产站点?
如果它提供了更好的可维护代码,那么性能的一小部分是可以接受的.如果内置协作功能也会很好 - 例如数据库迁移等.
(如果之前有人问过道歉 - 我不敢相信它没有,但我找不到一个.也许我的搜索功能很弱.)
多年来,我已经"知道"Java没有缩放数组的本机函数(即将每个元素乘以常量).所以我一直这样做:
for (int i=0; i<array.length; i++) {
array[i] = array[i] * scaleFactor;
}
Run Code Online (Sandbox Code Playgroud)
这实际上是最有效的方式(例如,在这个应用程序中,它是一个大约10000个双倍的数组)?或者,还有更好的方法?
clojure ×4
scala ×4
java ×3
actor ×1
agents ×1
arrays ×1
casting ×1
concurrency ×1
deriving ×1
haskell ×1
lift ×1
maven ×1
maven-2 ×1
migration ×1
performance ×1
persistent ×1
spring ×1
spring-test ×1
surefire ×1
tycho ×1
type-systems ×1
typeclass ×1
types ×1
vector ×1