我正在尝试使用ghc-modvim插件进行类型/语法检查等.但是,我发现ghc-mod总是在错误消息中使用完整的类型路径,例如:
test.hs|71 col 13 error| Couldn't match type ‘Data.Text.Internal.Text’
|| with ‘[GHC.Types.Char]’
|| Expected type: containers-0.5.6.2:Data.Map.Base.Map
|| [GHC.Types.Char]
|| ([(integer-gmp-1.0.0.0:GHC.Integer.Type.Integer,
|| integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)],
|| containers-0.5.6.2:Data.Set.Base.Set
|| integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)
|| Actual type: containers-0.5.6.2:Data.Map.Base.Map
|| Data.Text.Internal.Text
|| ([(integer-gmp-1.0.0.0:GHC.Integer.Type.Integer,
|| integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)],
|| containers-0.5.6.2:Data.Set.Base.Set
|| integer-gmp-1.0.0.0:GHC.Integer.Type.Integer)
|| In the second argument of ‘containers-0.5.6.2:Data.Map.Base.map’, namely
|| ‘zippedMap’
|| In the second argument of ‘(GHC.Base.$)’, namely
|| ‘containers-0.5.6.2:Data.Map.Base.map
...
Run Code Online (Sandbox Code Playgroud)
这会使屏幕变得杂乱,我很难找出哪里出了问题.作为比较,这是使用以下内容的同一文件的错误消息ghci:
test.hs:71:13:
Couldn't match type ‘T.Text’ with ‘[Char]’
Expected type: M.Map [Char] ([(Integer, …Run Code Online (Sandbox Code Playgroud) 对我来说,g /: f[g[x_]] := h[x]只是冗长等同于f[g[x_]] := h[x].你能提出一个你必须使用的例子/:吗?
我用来编写几个程序(带内存)的习语如下:
p1 :: State (Int, String) ()
p1 = do
(a, b) <- get
... do something ...
put (a', b)
p2 :: State (Int, String) ()
p2 = do
(a, b) <- get
... do something else ...
put (a, b')
main = do
... initializing a0 b0 ...
print . flip evalState (a0, b0)
. sequence $ replicate 10 p1 ++ repeat p2
Run Code Online (Sandbox Code Playgroud)
但是,随着状态变量数量的增加,这很快就会变得比必要的更冗长:
p1 :: State (Int, String, Bool, Int, String, Bool) ()
p1 = do
(a, …Run Code Online (Sandbox Code Playgroud) 我想编写一个在一个非常大的数组上运行的程序,并进行大量的随机访问读/写操作.我认为这vector是在Haskell中最合适的方式,所以我写了一个简单的程序来测试它的性能:
import Data.Int
import qualified Data.Vector.Unboxed.Mutable as UM
n = 1000000000
main = do
a <- UM.new n
UM.read a 42 :: IO Int32
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,它失败了segmentation fault:
$ ghc -O2 test.hs
$ ./test
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
这台机器有足够的内存用于阵列.这是输出free -h:
total used free shared buffers cached
Mem: 251G 150G 100G 672K 419M 141G
-/+ buffers/cache: 9.2G 242G
Swap: 255G 870M 255G
Run Code Online (Sandbox Code Playgroud)
是因为Haskell的vector包无法处理非常大的数组吗?我可以修改我的代码,以便它可以在大型阵列上工作而不会有太多的性能损失吗?
编辑:我的GHC版本是7.10.2.20150906,我的vector版本是0.11.0.0.这是在一台64位的linux机器上
> maxBound :: Int
9223372036854775807
Run Code Online (Sandbox Code Playgroud) 查看*.prof使用+RTS -p启用分析的编译生成的文件,我看到很多这些子例程命名为\:
COST CENTRE MODULE %time %alloc
main.\.\.\ Main 74.1 85.8
unstreamChunks/inner Data.Text.Internal.Lazy.Fusion 11.9 8.6
inverseLetters.\ Main 4.5 1.7
main.\.\.\.(...) Main 2.9 1.0
main.\.\.\.(...) Main 2.8 1.0
unstreamChunks/resize Data.Text.Internal.Lazy.Fusion 1.2 0.8
unstreamChunks/outer Data.Text.Internal.Lazy.Fusion 1.1 0.5
Run Code Online (Sandbox Code Playgroud)
这看起来很神秘.这些代表什么?
我注意到这两个定义无法在Haskell文档的最官方资源中找到:
(:) :: a -> [a] -> [a]
data [] a = [] | a : []
Run Code Online (Sandbox Code Playgroud)
我检查过Hoogle并且没有条目data []或(:).这两个不应该是"正常"功能和数据类型吗?
编辑:在Haskell 2010语言报告中,他们说
-- The (:) operator is built-in syntax, and cannot legally be given
-- a fixity declaration; but its fixity is given by:
-- infixr 5 :
Run Code Online (Sandbox Code Playgroud)
但为什么?是否有特殊原因可以挑出这个功能?
我看过一些程序显示了带有音轨的惊人高度详细的3D场景,但令我震惊的是它们都小于64kB!这些程序如何运作?

例如,我通常先键入成对的大括号,然后将光标移动到块中,我期望的应该是这样的:
....{
....?
....}
Run Code Online (Sandbox Code Playgroud)
但是vim会自动清空第二行,因为其中只有空格字符,因此结果如下:
....{
?
....}
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
(点用于空格字符,█表示光标的位置.)
通过(5,5)我的意思是第五行和第五列.
我发现使用屏幕坐标绘制东西非常困难,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间.为什么阻止程序员使用屏幕坐标/窗口坐标是如此严重?
例如,我想在一个类似文件中映射一个键,该tex文件包含许多不同类型的tex文件.我必须使用这样的多个命令吗?
au FileType tex nm <C-H> <Plug>IMAP_JumpForward
au FileType latex nm <C-H> <Plug>IMAP_JumpForward
au FileType context nm <C-H> <Plug>IMAP_JumpForward
au FileType plaintex nm <C-H> <Plug>IMAP_JumpForward
...
Run Code Online (Sandbox Code Playgroud)