我希望我的cabalised程序有一个--version开关.
我希望它报告与.cabal文件中存在的版本相同的版本.
如果我必须在我的Haskell源代码和.cabal文件中单独更新版本号,我最终会使它们不同步.
那么,我的程序如何在cabal下编译,从.cabal文件中获取其版本号?
我对Haskell和一般的函数式编程都很陌生.我的问题非常基本.Pattern Matching和Guards有什么区别?
使用模式匹配的功能
check :: [a] -> String
check [] = "Empty"
check (x:xs) = "Contains Elements"
Run Code Online (Sandbox Code Playgroud)
使用警卫的功能
check_ :: [a] -> String
check_ lst
| length lst < 1 = "Empty"
| otherwise = "Contains elements"
Run Code Online (Sandbox Code Playgroud)
对我来说,模式匹配和防护看起来基本相同.两者都评估条件,如果为true则将执行挂钩的表达式.我的理解是正确的吗?
在这个例子中,我可以使用模式匹配或防护来获得相同的结果.但是有些东西告诉我,我错过了一些重要的事情.我们可以一直替换另一个吗?
有人可以提供一些例子,其中模式匹配比警卫更受欢迎,反之亦然吗?
我看到Haskell中有一些XML处理库.
那么,如果我想要它,可以选择哪个库
虽然上面的大部分内容似乎足以满足我目前的需求,但是选择其中一个而不是其他需求的原因是什么?
UPD 20091222:
关于许可证的一些注意
众所周知,Haskell风格的类型类和ML风格的模块提供了不同的指定接口的机制.它们(可能)具有相同的功率,但实际上每种都有其自身的优点和缺点.
由于我在语言功能方面有点像包容性,我的问题是:在Haskell中添加ML样式模块有哪些主要的理论上的困难?我对以下几行的答案感兴趣:
现有的类型系统功能与ML型模块的交互性很差?(不良交互的一个例子是GADT和功能依赖,即使fundeps在技术上等同于相关类型!)
为了编译ML样式的模块,必须在编译器端放弃什么?
ML样式模块如何与类型推断交互?
相关阅读:
我正在努力完全理解Haskell的所有概念.
代数数据类型在哪些方面类似于泛型类型,例如在C#和Java中?它们有何不同?无论如何,他们有什么代数呢?
我熟悉通用代数及其环和字段,但我对Haskell的类型如何工作只有一个模糊的概念.
haskell types functional-programming algebraic-data-types data-structures
我一直在阅读"真实世界Haskell"一书,关于并发和并行的章节.我的问题如下:
由于Haskell线程实际上只是一个"真正的"OS线程中的多个"虚拟"线程,这是否意味着创建它们(如1000)不会对性能产生重大影响?即,我们可以说创建Haskell线程所产生的开销forkIO几乎可以忽略不计吗?如果可能的话,请带上典型的例子.
轻量级线程的概念是否阻止我们使用多核架构的好处?据我所知,两个Haskell线程不可能在两个独立的内核上并发执行,因为从操作系统的角度来看它们实际上是一个单独的线程.或者Haskell运行时是否做了一些聪明的技巧来确保可以使用多个CPU?
concurrency multithreading haskell multicore lightweight-processes
上帝我讨厌"代码味"这个词,但我想不出更准确的东西.
我正在业余时间为Whitespace设计一个高级语言和编译器,以了解编译器构造,语言设计和函数编程(编译器是用Haskell编写的).
在编译器的代码生成阶段,我必须在遍历语法树时保持"状态" - 数据.例如,在编译流控制语句时,我需要为要跳转到的标签生成唯一的名称(从传入,更新和返回的计数器生成的标签,并且绝不能再次使用计数器的旧值).另一个例子是当我在语法树中遇到内联字符串文字时,它们需要永久转换为堆变量(在空白中,字符串最好存储在堆上).我目前正在处理状态monad中的整个代码生成模块来处理这个问题.
我被告知编写编译器是一个非常适合功能范例的问题,但我发现我的设计方式与我在C中设计它的方式大致相同(你真的可以用任何语言编写C语言 - 甚至Haskell w/state monads).
我想学习如何在Haskell中思考(而不是在函数范式中) - 而不是在C中使用Haskell语法.我真的应该尝试消除/最小化状态monad的使用,还是一个合法的功能"设计模式"?
如果我错了,请纠正我,但似乎Haskell中的代数数据类型在许多你将在OO语言中使用类和继承的情况下都很有用.但是有一个很大的区别:一旦声明了代数数据类型,它就无法在其他地方扩展.它是"封闭的".在OO中,您可以扩展已定义的类.例如:
data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)
以后我无法以某种方式为此类型添加另一个选项而不修改此声明.那么这个系统有什么好处呢?似乎OO方式可以更加可扩展.
我无法弄清楚"| m - > w"-part在类定义中意味着什么:
class (Monoid w, Monad m) => MonadWriter w m | m -> w
Run Code Online (Sandbox Code Playgroud)
这增加了什么附加信息给类定义?
我已经读过Scala的类型系统被Java互操作性削弱了,因此无法执行与Haskell类型系统相同的功能.这是真的?因为类型擦除是弱点,还是我在各方面都错了?这是不同的Scala没有类型类的原因吗?
haskell type-systems scala language-comparisons static-typing
haskell ×10
type-systems ×3
syntax ×2
types ×2
cabal ×1
coding-style ×1
comparison ×1
concurrency ×1
guard ×1
ml ×1
monads ×1
multicore ×1
ocaml ×1
oop ×1
package ×1
scala ×1
sml ×1
state-monad ×1
typeclass ×1
version ×1
xml ×1