标签: ghc

Haskell编译器如何处理'where'语句?

在下面的函数中,我想知道编译器是否足够聪明,可以x保持不变,还是计算列表中每个项目的列表头部?(我正在使用GHC)

allSame :: Eq a => [a] -> Bool 
allSame xs = all (==x) xs  where x = head xs
Run Code Online (Sandbox Code Playgroud)

compiler-construction haskell ghc

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

Haskell(ghc)运行时内存使用情况或我做错了什么

我在haskell中编写了一个小程序,一种专门的HTTP服务器,它并不比下面的代码复杂得多.令我困惑的是它的内存消耗.比方说,当我运行一个从附带的代码编译的测试并且发出几个包含高达20Mb的整个程序的POST请求时,整个程序的VM大小将达到~800Mb,这听起来很奇怪.如果我让这样的程序的实例空闲,这个空间不会返回给系统.

这是什么意思?


import System.IO
import Network.HTTP.Server
import Network.Socket
import Network.URL


handler :: SockAddr -> URL -> Request String -> IO (Response String)
handler sa url rq = do
  writeFile "/tmp/out" (rqBody rq)
  return $ insertHeader HdrContentLength "0" (respond OK :: Response String)

main = serverWith defaultConfig {srvPort = 2121} handler
Run Code Online (Sandbox Code Playgroud)

haskell heap-memory ghc

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

Haskell:不能使用dropWhileEnd,模块Data.Text.Lazy/Data.Lazy未找到

首先,我必须承认:我对Haskell完全不熟悉.我已经练习了一下,现在在字符串操作方面遇到了一些麻烦:

我需要从字符串末尾开始删除/删除字符.我希望函数dropWhileEnd能够做到这一点,但是当我尝试导入Data.Text.Lazy或者Data.Lazy,ghc告诉我它找不到那些模块.

我的问题是:为什么ghc找不到它们?它们不应该在标准库中吗?我正在使用Haskell Platform 2010.2.0.0和Windows上包含的ghc.

haskell ghc haskell-platform

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

GHC截断Unicode字符输出

我不能让GHCi或GHC打印unicode代码点221A(sqrt符号:√).

我不认为这是我的shell,因为我可以得到ruby:

irb> puts "\u221A"
?
Run Code Online (Sandbox Code Playgroud)

GHC/GHCi是另一个问题:

ghci> putStrLn "\8730"

ghci> withFile "temp.out" WriteMode $ flip hPutStrLn "\8730"
ghci> readFile "temp.out"
"\SUB\n"
Run Code Online (Sandbox Code Playgroud)

那么我做错了什么?

(GHC v6.l0.3)

unicode haskell ghc

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

使用foldl',foldr列出连接

我现在正在学习Haskell,我遇到了以下问题:

我想用foldl'和foldr重写++函数.我用foldr完成了它:

myConcat xs ys = foldr (:) ys xs
Run Code Online (Sandbox Code Playgroud)

我不能用foldl'来做.我在RealWorldHaskell中读过,foldr对于做这种事情非常有用.好的,但是我不能用foldl写一个等价的++?有人可以告诉我如何做到这一点(如果可以做到......这本书没有提到任何关于它的事情)......

Haskell的类型机制阻止我这样做吗?每次我尝试我都会遇到类型错误...

haskell ghc

3
推荐指数
2
解决办法
6285
查看次数

为GADT定义自己的Typeable实例

有人能指出我在Haskell中为GADT定义Typeable或Typeable1实例的一组很好的例子.

或者,有人可以向我展示如何为以下GADT定义Typeable(手动).

data V a where
    Unit :: V () 
    Pair :: V a -> V b -> V (a, b) 
    L :: V a -> V (Either a b) 
    R :: V b -> V (Either a b) 
    Fresh :: Int -> V a
Run Code Online (Sandbox Code Playgroud)

或者,指向介绍该想法的论文的指针也会有所帮助.

haskell type-conversion ghc gadt

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

GHC/Haskell分析:函数消耗时间而不被调用

我已经使用GHC编译了一个Haskell程序并启用了分析.

$ ./server + RTS -M6m -p -RTS

我得到的个人资料如下:

                                                   individual    inherited
COST CENTRE      MODULE           no.    entries  %time %alloc   %time %alloc

poke_a4u64       Generator      2859       56436   0.0    0.0     0.4    0.4
 storeParameter  Generator      2860           0   0.4    0.4     0.4    0.4
  ppCurrent      Generator      2866       56436   0.0    0.0     0.0    0.0
  ppFeedback     Generator      2861       56436   0.0    0.0     0.0    0.0
Run Code Online (Sandbox Code Playgroud)

看起来像storeParameter永远不会被调用,但会消耗时间和内存.由于storeParameter调用ppCurrent,我猜storeParameter被称为56436次,就像ppCurrent一样.为什么不显示?

profiling haskell ghc

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

haskell - 是-ddump-simpl是获得具体类型的最佳方法吗?

我以前编写过一个似乎有效的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的monad变换器堆栈].

run_astvn ::
    LowerMonadT (StateT LowerSketchData Identity) ?
    -> Seq SketchAST
run_astvn x = get_ast2 $ runIdentity $
    runStateT (runStateT (runStateT x empty) empty)
        (LowerSketchData Set.empty)
    where get_ast2 = snd . fst
Run Code Online (Sandbox Code Playgroud)

我想得到具体的类型get_ast2.我似乎能够-ddump-simpl通过我的终端输出添加标志和grep,直到我找到,(清理了一点)

(((?, Seq SketchAST), Seq SketchAST), LowerSketchData) -> Seq SketchAST
Run Code Online (Sandbox Code Playgroud)

(对不起,这对其他人来说可能是胡说八道,但关键是它对我有用.)有更快/更方便的方法吗?如果不是很明显,在这种情况下我所说的"具体"是指上述类型是有用的; 知道的类型snd . fst不是:).

debugging haskell types ghc concrete

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

存在量化的类型示例在ghc 7.2.2中失败

根据维基百科,下面的代码应该编译,

{-# LANGUAGE RankNTypes #-}
data T = MkT (exists a. Show a => a)
Run Code Online (Sandbox Code Playgroud)

但是,我没有运气.ghci 7.2.2抱怨,

test.hs:2:23:
    Illegal symbol '.' in type
    Perhaps you intended -XRankNTypes or similar flag
    to enable explicit-forall syntax: forall <tvs>. <type>
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

原始链接在这里:http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types

提前致谢!

haskell ghc higher-rank-types

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

GHC.Prim.Any创建而不是自由变量[在多态函数中]

这是一个错误吗?

{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Text.Parsec.Token as P
import Text.Parsec.Language (haskellDef)
(P.TokenParser { P.identifier = ident }) = P.makeTokenParser haskellDef
Run Code Online (Sandbox Code Playgroud)

ident类型的收益率Text.Parsec.Prim.ParsecT String GHC.Prim.Any Data.Functor.Identity.Identity String,而定义

haskell = P.makeTokenParser haskellDef
ident = P.identifier haskell
Run Code Online (Sandbox Code Playgroud)

产生一种类型 Text.Parsec.Prim.ParsecT String u Data.Functor.Identity.Identity String

编辑

ghci的行为不一样,

infixl 4 <++>
(<++>) = liftM2 (++)

(P.TokenParser { P.identifier = ident }) = P.makeTokenParser haskellDef
suitable_macro = ident

parseMacro = many space *> suitable_macro

parseMacro' =
    try (string "{{" *> parseMacro <* string …
Run Code Online (Sandbox Code Playgroud)

haskell field ghc

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