为什么这个类型检查:
runST $ return $ True
Run Code Online (Sandbox Code Playgroud)
虽然以下不是:
runST . return $ True
Run Code Online (Sandbox Code Playgroud)
GHCI抱怨:
Couldn't match expected type `forall s. ST s c0'
with actual type `m0 a0'
Expected type: a0 -> forall s. ST s c0
Actual type: a0 -> m0 a0
In the second argument of `(.)', namely `return'
In the expression: runST . return
Run Code Online (Sandbox Code Playgroud) 是否有一个用于自动区分的Haskell库,可以使用未装箱的向量?在grad从功能Numeric.AD要求的一个实例Traversable,这Data.Vector.Unboxed是没有的.
通常推荐的Haskell字符串类型似乎是ByteString或Text.我经常使用大量短(英文单词大小)字符串,并且通常需要将它们存储在诸如Data.Map的查找表中.在许多情况下,我发现在这种情况下,字符串表可以占用比ByteStrings表更少的内存.Word8的Unboxed Data.Vectors也比ByteStrings更紧凑.
当需要在Haskell中存储和比较大量小字符串时,最佳做法是什么?
下面我试图将一个特定问题的案例压缩成一个小例子:
import qualified Data.ByteString.Lazy.Char8 as S
import qualified Data.ByteString as Strict
import qualified Data.Map as Map
import qualified Data.Vector.Unboxed as U
import qualified Data.Serialize as Serialize
import Control.Monad.State
main = putStr
. unlines . map show . flip evalState (0,Map.empty)
. mapM toInt
. S.words
=<<
S.getContents
toInt x = do
let x' =
U.fromList . Strict.unpack . -- Comment this line to increase memory usage
Serialize.encode $ x
(i,t) <- get
case Map.lookup x' t of …Run Code Online (Sandbox Code Playgroud) 如何在Haskell中的以下示例中对函数求值进行推理:
let f x = ...
x = ...
in map (g (f x)) xs
Run Code Online (Sandbox Code Playgroud)
在GHC,有时(f x)是对各元素只计算一次,有时一次xs,这取决于究竟f和g是.当f x计算成本昂贵时,这可能很重要.它刚刚绊倒了我正在帮助的Haskell初学者,我不知道该告诉他什么,除了它取决于编译器.还有更好的故事吗?
更新
在以下示例(f x)中将评估4次:
let f x = trace "!" $ zip x x
x = "abc"
in map (\i -> lookup i (f x)) "abcd"
Run Code Online (Sandbox Code Playgroud) 当GHC编译的程序花费大量时间进行垃圾收集时,是否有任何通用规则可以发现原因?什么通常被认为太多了?例如,一般来说,60%的生产率是可以接受的,还是表明代码可能存在问题?
给定一对对列表xys,将其解压缩为两个列表的Python成语是:
xs, ys = zip(*xys)
Run Code Online (Sandbox Code Playgroud)
如果xys是迭代器,我如何将其解压缩为两个迭代器,而不将所有内容存储在内存中?
Haddock似乎错误地重新编码UTF-8编码源文件的文档中的非ASCII字符.我经常需要在文档中包含数学公式,如果可以使用诸如求和(Σ)之类的常见数学符号,它们更易读.
但是,在通过haddock运行文件后,这些符号变为空白方块.Haddock有选项,--use-unicode但只是将函数签名等中的函数箭头转换为unicode字符,同时仍然打破了实际的文档.
如果可以控制它,那就更好了cabal haddock!
我正在使用Haddock版本2.9.4.
Data.Vector.Unboxed不是一个实例Foldable.编写一个适用于实例Foldable以及未装箱矢量的函数的最佳方法是什么?例如,此版本的sum工作包含列表和盒装矢量,但未取消装箱:
sum :: (Foldable t, Num a) => t a -> a
sum = Foldable.foldl' (+) 0
Run Code Online (Sandbox Code Playgroud) 什么是在Data.Vector.Unboxed和之间转换的推荐方法Data.Vector.具体来说,我需要将一个函数映射到一个向量上,该向量将一个无法转换的元素类型转换为Int一个非无法转换的元素类型,例如Text.我假设通过中间列表不会非常有效.
In [20]: from collections import Counter
In [21]: x = [Counter()]
In [22]: z = x[0]
In [23]: z.update("w")
In [24]: z
Out[24]: Counter({'w': 1})
In [25]: x
Out[25]: [Counter({'w': 1})]
In [26]: z += Counter(["q"])
In [27]: z
Out[27]: Counter({'q': 1, 'w': 1})
In [28]: x
Out[28]: [Counter({'w': 1})]
Run Code Online (Sandbox Code Playgroud)
我原x以为是[Counter({'q': 1, 'w': 1})].怎么了?
我添加了一个目录到本地git repo使用git add然后意外地做了git rm -rf(没有提交之前).有没有办法从这个目录中恢复文件?