相关疑难解决方法(0)

foldl是尾递归的,那么foldr如何比foldl运行得更快呢?

我想测试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获胜的明显案例吗?

optimization haskell tail-recursion combinators fold

68
推荐指数
4
解决办法
2万
查看次数

如何在GHCI中加载优化代码?

我正在编写一个依赖于优化的模块.我想在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)

haskell ghc compiler-optimization ghci read-eval-print-loop

9
推荐指数
1
解决办法
1087
查看次数

enumFromTo如何工作?

我无法添加一个数字Char; 以下将无法编译'a' + 1.但是,['a'..'z']成功创建了一个字符串,其中每个字符值都会递增.有一个特殊的功能,可以增加一个Char

我知道我能做到chr (ord c + 1).

['a'..'z']或者底层enumFromTo函数如何增加结果中的字符String

haskell typeclass

7
推荐指数
1
解决办法
753
查看次数

具有haskell中的多参数函数的延迟过滤器

我正在编写一个删除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)

haskell functional-programming

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