小编gaw*_*awi的帖子

什么是Haskell对Node.js的响应?

我相信Erlang社区并不羡慕Node.js,因为它本身可以进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(甚至没有内置在Node.js中).有关详情,请访问http://journal.dedasys.com/2010/04/29/erlang-vs-node-jsNode.js或Erlang

那么Haskell呢?Haskell能否提供Node.js的一些好处,即一个干净的解决方案,以避免在不使用多线程编程的情况下阻止I/O?


Node.js有很多吸引人的东西

  1. 事件:没有线程操作,程序员只提供回调(如在Snap框架中)
  2. 保证回调在单个线程中运行:不存在竞争条件.
  3. 简单易用的UNIX友好API.好处:优秀的HTTP支持.DNS也可用.
  4. 默认情况下,每个I/O都是异步的.这样可以更容易地避免锁定.但是,回调中过多的CPU处理会影响其他连接(在这种情况下,任务应分成较小的子任务并重新调度).
  5. 客户端和服务器端的语言相同.(但是我没有看到这个值太多了.jQuery和Node.js共享事件编程模型,但其余部分非常不同.我只是看不出服务器端和客户端之间的共享代码如何在实践中很有用.)
  6. 所有这些都包装在一个产品中.

concurrency multithreading haskell node.js

215
推荐指数
6
解决办法
5万
查看次数

应用解析比monadic解析有什么好处?

似乎已经达成共识,你应该使用Parsec作为应用而不是monad.应用解析比monadic解析有什么好处?

  • 样式
  • 性能
  • 抽象化

monadic解析了吗?

monads haskell parsec applicative

61
推荐指数
3
解决办法
1万
查看次数

避免Haskell中的命名空间污染

我在程序中使用了很多不同的记录,其中一些使用相同的字段名称,例如

data Customer = Customer { ..., foo :: Int, ... }
data Product = Product { ..., foo :: Int, ... }
Run Code Online (Sandbox Code Playgroud)

现在,由于访问器函数"foo"被定义了两次,我得到"多个声明"错误.避免这种情况的一种方法是使用完全限定导入的不同模块,或者只是重命名字段(我不想这样做).

在Haskell处理这个问题的官方建议方法是什么?

haskell types records namespaces

54
推荐指数
4
解决办法
6324
查看次数

将Parsec与Data.Text一起使用

使用Parsec 3.1,可以解析几种类型的输入:

  • [Char]Text.Parsec.String
  • Data.ByteStringText.Parsec.ByteString
  • Data.ByteString.LazyText.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)
  1. 这样做有意义吗?
  2. 它与Parsec API的其余部分兼容吗?

附加评论:

我必须{-# LANGUAGE NoMonomorphismRestriction #-} …

haskell parsec

33
推荐指数
3
解决办法
4504
查看次数

在Haskell中,为什么非详尽模式不是编译时错误?

这是我在调用Haskell子字符串函数时为什么会得到"函数中的非详尽模式..."的后续内容

据我所知,使用-WallGHC可以警告不详尽的模式.我想知道在默认情况下没有使它成为编译时错误的原因是什么,因为它始终可以显式定义部分函数:

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编译器来执行这种分析?
  • 一个非详尽的模式搜索可以找到一些但不是所有的情况?
  • 部分定义的函数被认为是合法的,并且经常使用不足以强加上面显示的那种构造?如果是这种情况,你能解释一下为什么非详尽的模式是有帮助/合法的吗?

haskell functional-programming non-exhaustive-patterns partial-functions

29
推荐指数
2
解决办法
7817
查看次数

对GHC-Wall风格的影响

使用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吗?

warnings haskell coding-style compiler-warnings ghc

24
推荐指数
4
解决办法
3938
查看次数

在ghci中为模块相关命令指定包名称

是否有针对该模块指定包名的方式: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选项是我唯一可以做的事情来避免歧义吗?

haskell ghci

22
推荐指数
2
解决办法
5709
查看次数

说服客户升级到Java 5

我们向一些客户销售打包的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?

我们能告诉他们什么?这对他们有什么影响?

到目前为止我有:

  1. 更好的性能,因为JVM在Java 5中更有效(使用Java 6更好).不过,我不能把数字放在上面.不确定IBM VM是否有很大改进(我们的客户端之一正在AIX上运行).
  2. 支持.IBM WAS 5.1只能通过特殊的扩展支持程序来支持.

他们是大公司,所以他们提前一年以上计划他们的解决方案.他们今天选择了成熟产品,并在几年后部署它.然后该产品在生命结束前几个月.

请参阅IBM WebSphere Application Server比较

java arguments upgrade

13
推荐指数
3
解决办法
689
查看次数

在Haskell中出现故障

在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是否有更优雅的方式来讨论函数的参数乱了?

haskell currying

13
推荐指数
1
解决办法
2374
查看次数

为什么`(map digitToInt).秀`这么快?

将非负数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)

performance haskell digits ghc

12
推荐指数
2
解决办法
1137
查看次数