虽然Haskell社区的一般意见似乎总是更好地使用Text
而不是String
,大多数维护的库的API仍然是面向我的事实String
混淆了我.另一方面,有一些值得注意的项目,它们String
完全被视为一个错误,并提供了Prelude
所有String
面向函数的实例,这些函数被它们的Text
-counterparts 取代.
那么String
除了向后兼容的标准Prelude兼容性和"交换制作intertia"之外,人们还有任何理由继续使用面向编写的API吗?与之Text
相比,是否还有其他缺点String
?
特别是,我对此感兴趣,因为我正在设计一个库并试图决定使用哪种类型来表达错误消息.
Haskell功能强大且纯粹,所以基本上它具有编译器能够处理隐式并行性所需的所有属性.
考虑这个简单的例子:
f = do
a <- Just 1
b <- Just $ Just 2
-- ^ The above line does not utilize an `a` variable, so it can be safely
-- executed in parallel with the preceding line
c <- b
-- ^ The above line references a `b` variable, so it can only be executed
-- sequentially after it
return (a, c)
-- On the exit from a monad scope we wait for all computations to …
Run Code Online (Sandbox Code Playgroud) parallel-processing concurrency haskell compiler-optimization
说,我有一个字符串序列作为输入,我想得到一个新的不可变Seq
,它由输入元素和一个项目组成"c"
.以下是我发现的两种方法:
assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))
- 这个的问题是,似乎Seq("c")
仅仅为了操作而实例化临时序列()是有害的并且将导致开销assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)
- 这个将输入集合的类型限制为a List
,因此Seq("a", "b") ::: "c" :: Nil
不起作用.此外,似乎实例化a Nil
也可能导致开销我的问题是:
Seq("a", "b") ::: Nil
不允许Scala开发人员的缺陷?在Scala 2.10中如何从字符串生成一个类(可能使用Toolbox api)以后用Scala的反射进行实例化?
有特点
trait Persisted {
def id: Long
}
Run Code Online (Sandbox Code Playgroud)
如何实现一个接受任何case类实例的方法并返回其特征混合的副本?
该方法的签名如下:
def toPersisted[T](instance: T, id: Long): T with Persisted
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个转化的最佳途径collection.mutable.Seq[T]
来collection.immutable.Seq[T]
.
有一个具有惰性和严格实现的数据结构列表:
Data.Map.Lazy
和 Data.Map.Strict
Data.IntMap.Lazy
和 Data.IntMap.Strict
Data.HashMap.Lazy
和 Data.HashMap.Strict
Data.ByteString.Lazy
和 Data.ByteString.Strict
Data.Text.Lazy
和 Data.Text
这些实施的优点和缺点是什么?选择特定实施时应遵循哪些规则?
我目前正在Scala中迈出第一步,所以我正在寻找解决常见问题的最佳实践.以下是不起作用的代码,但它描述了我想要做的事情.能否请您推荐解决此问题的最佳方法?
def resolveDriver(url: String) = {
url match {
case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver"
case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver"
case url.startsWith("jdbc:h2:") => "org.h2.Driver"
case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver"
case _ => throw new IllegalArgumentException
}
}
Run Code Online (Sandbox Code Playgroud) 我有一些数据可以用无符号Integral
类型表示,其最大值需要52位.仅限AFAIK Integer
,Int64
并Word64
满足这些要求.
我可以找到关于这些类型的所有信息Integer
都是签名的并且具有浮动的无限位大小,Int64
并且Word64
分别是固定的,有符号和无符号的.我不知道的是有关这些类型的实际实施的信息:
如果存储为Integer
?,52位值实际占用多少位?
我是否正确,Int64
并Word64
允许您存储64位数据,并为任何值权重64位?
这些类型中的任何一种是否因大小等原因而更具性能或优先性,例如本机代码实现或直接处理器指令相关的优化?
以防万一:您建议将哪一个存储在一个对性能极为敏感的应用程序中的52位值?
具有以下项目结构:
src/FirstExecutable.hs
src/SecondExecutable.hs
my-amazing-project.cabal
Run Code Online (Sandbox Code Playgroud)
和以下cabal设置:
name: my-amazing-project
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.8
executable first-executable
hs-source-dirs: src
main-is: FirstExecutable.hs
ghc-options: -O2 -threaded -with-rtsopts=-N
build-depends: base == 4.5.*
executable second-executable
hs-source-dirs: src
main-is: SecondExecutable.hs
ghc-options: -O2 -threaded -with-rtsopts=-N
build-depends: base == 4.5.*
Run Code Online (Sandbox Code Playgroud)
cabal install
使用以下输出运行失败:
Installing executable(s) in
/Users/mojojojo/Library/Haskell/ghc-7.4.2/lib/my-amazing-project-0.1.0.0/bin
cabal: dist/build/second-executable/second-executable: does not exist
Failed to install my-amazing-project-0.1.0.0
cabal: Error: some packages failed to install:
my-amazing-project-0.1.0.0 failed during the final install step. The exception
was:
ExitFailure 1
Run Code Online (Sandbox Code Playgroud)
我做错了什么或者这是一个Cabal bug?
可执行模块的内容如下:
module …
Run Code Online (Sandbox Code Playgroud) haskell ×5
scala ×5
cabal ×1
case-class ×1
collections ×1
concurrency ×1
containers ×1
integer ×1
list ×1
mixins ×1
reflection ×1
scala-2.10 ×1
seq ×1
string ×1
text ×1
toolbox ×1
traits ×1