我想测试foldl vs foldr.从我所看到的,你应该使用foldl over foldr,因为尾部递归优化.
这是有道理的.但是,运行此测试后,我很困惑:
foldr(使用时间命令时需要0.057秒):
a::a -> [a] -> [a]
a x = ([x] ++ )
main = putStrLn(show ( sum (foldr a [] [0.. 100000])))
Run Code Online (Sandbox Code Playgroud)
foldl(使用time命令时需要0.089s):
b::[b] -> b -> [b]
b xs = ( ++ xs). (\y->[y])
main = putStrLn(show ( sum (foldl b [] [0.. 100000])))
Run Code Online (Sandbox Code Playgroud)
很明显,这个例子很简单,但我很困惑为什么foldr击败foldl.这不应该是foldl获胜的明显案例吗?
我正在编写一个依赖于优化的模块.我想在ghci中测试这个模块.但是在--interactive模式下启动ghc会自动禁用优化; 如果我编译模块-O然后尝试在交互式会话中ghc加载它,坚持在解释模式下加载它.
对于区分优化和未优化模块的简单测试用例,isOptimized下面评估为True优化,但False优化关闭:
isOptimized :: Bool
isOptimized = g
g :: Bool
g = False
{-# NOINLINE g #-}
{-# RULES "g/True" g = True #-}
Run Code Online (Sandbox Code Playgroud) 我无法添加一个数字Char; 以下将无法编译'a' + 1.但是,['a'..'z']成功创建了一个字符串,其中每个字符值都会递增.有一个特殊的功能,可以增加一个Char?
我知道我能做到chr (ord c + 1).
['a'..'z']或者底层enumFromTo函数如何增加结果中的字符String?
我正在编写一个删除json字符串中的空格的函数.我需要知道我正在处理的当前字符是否被包围",或者它是否在转义字符之后\.所以我需要两个param用于此功能.
这是当前的实现.但我不认为这是懒惰的.如何在json字符串上使用"filter"或"map"使其变得懒惰?
compressJson :: String -> String
compressJson json = compress json False False ""
-- compress params: json, inStr, aferEscape, acc
where compress [] _ _ acc = acc
compress ('\"' : xs) inStr False acc = compress xs (not inStr) False (acc ++ "\"")
compress ('\\' : xs) inStr False acc = compress xs inStr True acc
compress (x : xs) inStr True acc = compress xs inStr False (acc ++ ['\\', x])
compress …Run Code Online (Sandbox Code Playgroud)