我相信Erlang社区并不羡慕Node.js,因为它本身可以进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(甚至没有内置在Node.js中).有关详情,请访问http://journal.dedasys.com/2010/04/29/erlang-vs-node-js和Node.js或Erlang
那么Haskell呢?Haskell能否提供Node.js的一些好处,即一个干净的解决方案,以避免在不使用多线程编程的情况下阻止I/O?
Node.js有很多吸引人的东西
似乎已经达成共识,你应该使用Parsec作为应用而不是monad.应用解析比monadic解析有什么好处?
monadic解析了吗?
我在程序中使用了很多不同的记录,其中一些使用相同的字段名称,例如
data Customer = Customer { ..., foo :: Int, ... }
data Product = Product { ..., foo :: Int, ... }
Run Code Online (Sandbox Code Playgroud)
现在,由于访问器函数"foo"被定义了两次,我得到"多个声明"错误.避免这种情况的一种方法是使用完全限定导入的不同模块,或者只是重命名字段(我不想这样做).
在Haskell处理这个问题的官方建议方法是什么?
使用Parsec 3.1
,可以解析几种类型的输入:
[Char]
同 Text.Parsec.String
Data.ByteString
同 Text.Parsec.ByteString
Data.ByteString.Lazy
同 Text.Parsec.ByteString.Lazy
我没有看到该Data.Text
模块的任何内容.我想解析Unicode内容而不会遇到String
效率低下的问题.所以我基于Text.Parsec.ByteString
模块创建了以下模块:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Text.Parsec.Text
( Parser, GenParser
) where
import Text.Parsec.Prim
import qualified Data.Text as T
instance (Monad m) => Stream T.Text m Char where
uncons = return . T.uncons
type Parser = Parsec T.Text ()
type GenParser t st = Parsec T.Text st
Run Code Online (Sandbox Code Playgroud)
附加评论:
我必须{-# LANGUAGE NoMonomorphismRestriction #-} …
这是我在调用Haskell子字符串函数时为什么会得到"函数中的非详尽模式..."的后续内容?
据我所知,使用-Wall
GHC可以警告不详尽的模式.我想知道在默认情况下没有使它成为编译时错误的原因是什么,因为它始终可以显式定义部分函数:
f :: [a] -> [b] -> Int
f [] _ = error "undefined for empty array"
f _ [] = error "undefined for empty array"
f (_:xs) (_:ys) = length xs + length ys
Run Code Online (Sandbox Code Playgroud)
问题不是针对GHC的.
是因为......
haskell functional-programming non-exhaustive-patterns partial-functions
使用GHC警告被视为良好做法-Wall
.但是,我发现修复这些警告会对某些类型的代码构造产生负面影响.
例1:
f >>
如果我没有明确使用_ <- f
表单,使用等号的do- not会产生警告:
Warning: A do-notation statement discarded a result of type Char.
Suppress this warning by saying "_ <- f",
or by using the flag -fno-warn-unused-do-bind
Run Code Online (Sandbox Code Playgroud)
我明白我可以忘记做一些事情f
.但是,忽略结果是合理的(在解析器中很常见).使用时没有警告>>
,对吧?使用_ <-
比它应该更重.
例2:
使用可见函数的相同名称命名模式变量将给出:
Warning: This binding for `map' shadows the existing binding
imported from Prelude
Run Code Online (Sandbox Code Playgroud)
当使用记录语法时,这会越来越严重,因为命名空间会被快速污染.解决方案是在模式表达式中提供备用名称.因此,为了避免警告,我最终使用了一个不太合适的名称.我觉得这不是一个足够好的理由.
我知道我可以使用-fno-warn-...
选项,但我应该坚持使用-Wall
吗?
是否有针对该模块指定包名的方式:browse
,:load
或:module
在ghci的命令(6.12.1版本)?
一些模块名称含糊不清:
Prelude> :module Control.Monad.Cont
<no location info>:
Ambiguous module name `Control.Monad.Cont':
it was found in multiple packages: mtl-1.1.0.2 monads-fd-0.1.0.2
Run Code Online (Sandbox Code Playgroud)
设置-hide-package
选项是我唯一可以做的事情来避免歧义吗?
我们向一些客户销售打包的Java Web应用程序.它基本上是一组servlet,一些SOAP Web服务和一些静态资源.我们不做EJB或任何其他Java Enterprise花哨的东西.
我们的一些客户正在运行IBM WebSphere Application Server v5.1,因此我们仅限于运行时和开发的Java 1.4.当然,我们希望使用Java 5(甚至更好的Java 6)进行开发.在1.4中执行SOAP需要一个外部库(我们使用AXIS,但它正在老化).我们不能使用enum,拳击,泛型......找到符合1.4标准的第三方库变得越来越难.
客户目前对这种旧但工作良好的设置感到满意.我们希望他们升级他们的Java运行时.在这种情况下,它意味着升级到IBM WAS 6.1或7.0?
我们能告诉他们什么?这对他们有什么影响?
到目前为止我有:
他们是大公司,所以他们提前一年以上计划他们的解决方案.他们今天选择了成熟产品,并在几年后部署它.然后该产品在生命结束前几个月.
在Haskell中是否有一个优雅的表示法来理解函数的参数?
例如,如果您希望将2除以列表的所有元素,则可以编写
map ((/) 2) [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
但是,为了划分列表的所有元素,您似乎需要定义匿名函数
map (\x -> x/2) [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
在更复杂的情况下,匿名函数很快变得难以处理.我知道在这种情况下map((*)0.5)[1,2,3,4,5]可以正常工作,但我很想知道Haskell是否有更优雅的方式来讨论函数的参数乱了?
将非负数Integer
转换为其数字列表通常如下所示:
import Data.Char
digits :: Integer -> [Int]
digits = (map digitToInt) . show
Run Code Online (Sandbox Code Playgroud)
我试图找到一种更直接的方式来执行任务,而不涉及字符串转换,但我无法想出更快的东西.
到目前为止我一直在尝试的事情:
基线:
digits :: Int -> [Int]
digits = (map digitToInt) . show
Run Code Online (Sandbox Code Playgroud)
从StackOverflow上的另一个问题得到这个:
digits2 :: Int -> [Int]
digits2 = map (`mod` 10) . reverse . takeWhile (> 0) . iterate (`div` 10)
Run Code Online (Sandbox Code Playgroud)
试着自己动手:
digits3 :: Int -> [Int]
digits3 = reverse . revDigits3
revDigits3 :: Int -> [Int]
revDigits3 n = case divMod n 10 of
(0, digit) -> [digit]
(rest, …
Run Code Online (Sandbox Code Playgroud) haskell ×9
ghc ×2
parsec ×2
applicative ×1
arguments ×1
coding-style ×1
concurrency ×1
currying ×1
digits ×1
ghci ×1
java ×1
monads ×1
namespaces ×1
node.js ×1
performance ×1
records ×1
types ×1
upgrade ×1
warnings ×1