考虑面向对象的语言: 大多数来自面向对象编程背景的人都熟悉各种语言中常见的直观界面,这些界面捕捉了Java Collection & List界面的精髓。 Collection是指不一定具有自然顺序/索引的对象的集合。 List是一个具有自然顺序/索引的集合。 这些接口抽象了Java中的许多库数据结构,就像他们在其他语言中的等价接口一样,并且需要对这些接口有一个深入的了解才能与大多数库数据结构有效地协作。 过渡到Haskell: Haskell有一个types类系统,类似于对象上的接口types。 Haskell似乎有一个关于Functors,Applicative,Monads等devise良好的types层次结构 。 他们显然需要正确和抽象的types 。 然而,当你看到许多Haskell的容器( List , Map , Sequence , Set , Vector )时,它们几乎都具有非常相似的(或相同的)function,但不是通过types类来抽象的。 一些例子: null用于testing“ null ” 元素数量的length / size elem / member列入集合 empty 和/或 singleton默认构造 union联盟 (\\) / diff设置差异 (!) / (!!)进行不安全的索引(部分function) (!?) / lookup安全索引(总function) 如果我想使用上面的任何函数,但是我导入了两个或多个容器,我必须从导入的模块中隐藏函数,或者只从模块导入必要的函数,或者限定导入的模块。 但是因为所有的function都提供了相同的逻辑function,所以看起来就像一个麻烦。 如果函数是从types类定义的,而不是在每个模块中单独定义的,那么编译器的types推断机制就可以解决这个问题。 只要他们共享types类(例如:让我们只使用Sequence而不是List来获得更好的随机访问效率),它也会使底层容器的切换变得简单。 为什么Haskell没有一个Collection和/或Indexabletypes的类来统一和概括这些函数呢?
假设我有一个types类来certificate一个Shapeless副产品中的所有types都是单例types: import shapeless._ trait AllSingletons[A, C <: Coproduct] { def values: List[A] } object AllSingletons { implicit def cnilSingletons[A]: AllSingletons[A, CNil] = new AllSingletons[A, CNil] { def values = Nil } implicit def coproductSingletons[A, H <: A, T <: Coproduct](implicit tsc: AllSingletons[A, T], witness: Witness.Aux[H] ): AllSingletons[A, H :+: T] = new AllSingletons[A, H :+: […]
我很困惑haskell编译器如何推断比我所期望的多态性更less的types,例如,当使用无点定义时。 看起来问题是“单态限制”,在编译器的旧版本上默认是这样的。 考虑下面的haskell程序: {-# LANGUAGE MonomorphismRestriction #-} import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 如果我用ghc编译这个,我没有得到erros,可执行文件的输出是: 3.0 3.0 [1,2,3] 如果我将main更改为: main = do print $ plus' 1.0 2.0 print $ […]
我有以下通用types的方法: T GetValue<T>(); 我想限制T原始types,如int,string,浮动,但不是类的types。 我知道我可以像这样为类types定义generics: C GetObject<C>() where C: class; 我不确定原始types是否可行,如果是的话。
我有一个代表RGB图像的整数数组,并希望将其转换为字节数组并将其保存到文件中。 在Java中将整数数组转换为字节数组的最佳方法是什么?
我很好奇string和原始types。 像这样的文章说的string是原始types。 但是MSDN上的第二篇文章并没有列出string为原始types。 但是,当我运行第二篇文章中提供的代码时,它显示的string不是原始types 。 任何人都可以指导我吗?
首先,为了使事情更清楚,我将从顶部解释我的情况: 我有一个具有以下签名的方法: public virtual void SendEmail(String from, List<String> recepients, Object model) 我想要做的是生成一个匿名对象,它具有模型对象的属性以及前两个参数。 将模型对象展平为PropertyInfo []非常简单。 因此,我想创build一个字典,它将持有PropertyInfo和前两个参数,然后转换为匿名对象,其中键是属性的名称,值是属性的实际值。 那可能吗? 还有其他build议吗?
是否有任何可衡量的性能差异 ((TypeA) obj).method1(); ((TypeA) obj).method2(); ((TypeA) obj).method3(); 和 var A = (TypeA) obj; A.method1(); A.method2(); A.method3(); 当使用很多次? 我经常看到类似的东西 if (((TextBox)sender).Text.Contains('.') || ((TextBox)sender).Text.Contains(',')) 并想知道这是否浪费表演。
我只是在VisualStudio 2012中testing打字稿,并且对其types系统有问题。 我的HTML网站有一个ID为“mycanvas”的canvas标签。 我试图在这个canvas上画一个矩形。 这是代码 var canvas = document.getElementById("mycanvas"); var ctx: CanvasRenderingContext2D = canvas.getContext("2d"); ctx.fillStyle = "#00FF00"; ctx.fillRect(0, 0, 100, 100); 不幸的是VisualStudio抱怨 属性'getContext'在types'HTMLElement'的值上不存在 它将第二行标记为错误。 我认为这只是一个警告,但代码不能编译。 VisualStudio说 有构build错误。 你想继续并运行最后的成功构build? 我根本不喜欢这个错误。 为什么没有dynamic的方法调用? 毕竟getContext的方法肯定存在于我的canvas元素上。 但是我认为这个问题很容易解决。 我刚刚为canvas添加了一个types标注: var canvas : HTMLCanvasElement = document.getElementById("mycanvas"); var ctx: CanvasRenderingContext2D = canvas.getContext("2d"); ctx.fillStyle = "#00FF00"; ctx.fillRect(0, 0, 100, 100); 但types系统仍然不满意。 这是新的错误信息,这次是在第一行: 无法将“HTMLElement”转换为“HTMLCanvasElement”:input“HTMLElement”缺less来自types“HTMLCanvasElement”的属性“toDataURL” 那么,我全力以赴进行静态打字,但这使得语言无法使用。 […]
所以,我有一个像这样的构造函数的类: public FilterList(Set<Integer> labels) { … } 我想用一个空集合构造一个新的FilterList对象。 遵循Joshua Bloch在他的书“有效的Java”中的build议,我不想为空集创build一个新的对象; 我只是使用Collections.emptySet()来代替: FilterList emptyList = new FilterList(Collections.emptySet()); 这给了我一个错误,抱怨java.util.Set<java.lang.Object>不是一个java.util.Set<java.lang.Integer> 。 好的,这个怎么样: FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet()); 这也给我一个错误! 好的,这个怎么样: Set<Integer> empty = Collections.emptySet(); FilterList emptyList = new FilterList(empty); 嘿,它的工作! 但为什么? 毕竟,Java没有types推断,这就是为什么如果您执行Set<Integer> foo = new TreeSet()而不是Set<Integer> foo = new TreeSet<Integer>() ,您将获得未经检查的转换警告。 但是Set<Integer> empty = Collections.emptySet(); 甚至没有警告的作品。 这是为什么?