在下面的函数中,我想知道编译器是否足够聪明,可以x保持不变,还是计算列表中每个项目的列表头部?(我正在使用GHC)
allSame :: Eq a => [a] -> Bool
allSame xs = all (==x) xs where x = head xs
Run Code Online (Sandbox Code Playgroud) 我在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完全不熟悉.我已经练习了一下,现在在字符串操作方面遇到了一些麻烦:
我需要从字符串末尾开始删除/删除字符.我希望函数dropWhileEnd能够做到这一点,但是当我尝试导入Data.Text.Lazy或者Data.Lazy,ghc告诉我它找不到那些模块.
我的问题是:为什么ghc找不到它们?它们不应该在标准库中吗?我正在使用Haskell Platform 2010.2.0.0和Windows上包含的ghc.
我不能让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)
我现在正在学习Haskell,我遇到了以下问题:
我想用foldl'和foldr重写++函数.我用foldr完成了它:
myConcat xs ys = foldr (:) ys xs
Run Code Online (Sandbox Code Playgroud)
我不能用foldl'来做.我在RealWorldHaskell中读过,foldr对于做这种事情非常有用.好的,但是我不能用foldl写一个等价的++?有人可以告诉我如何做到这一点(如果可以做到......这本书没有提到任何关于它的事情)......
Haskell的类型机制阻止我这样做吗?每次我尝试我都会遇到类型错误...
有人能指出我在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)
或者,指向介绍该想法的论文的指针也会有所帮助.
我已经使用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一样.为什么不显示?
我以前编写过一个似乎有效的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的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不是:).
根据维基百科,下面的代码应该编译,
{-# 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
提前致谢!
这是一个错误吗?
{-# 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)