标签: ghc

为什么`-threaded`会让它变慢?

一个简单的计划:

import qualified Data.ByteString.Lazy.Char8 as BS

main = do
  wc <- length . BS.words <$> BS.getContents
  print wc
Run Code Online (Sandbox Code Playgroud)

为速度而建:

ghc -fllvm -O2 -threaded -rtsopts Words.hs
Run Code Online (Sandbox Code Playgroud)

更多的CPU意味着更慢?

$ time ./Words +RTS -qa -N1 < big.txt
331041862

real  0m25.963s
user  0m21.747s
sys 0m1.528s
$ time ./Words +RTS -qa -N2 < big.txt
331041862

real  0m36.410s
user  0m34.910s
sys 0m6.892s
$ time ./Words +RTS -qa -N4 < big.txt
331041862

real  0m42.150s
user  0m55.393s
sys 0m16.227s
Run Code Online (Sandbox Code Playgroud)

好的措施:

$time wc -w big.txt
 331041862 big.txt

real    0m8.277s …
Run Code Online (Sandbox Code Playgroud)

multithreading haskell ghc

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

Core Haskell将类型应用于函数意味着什么?

我为Core Haskell编写了一个定制漂亮的打印机,以便更好地研究Core的结构.这个漂亮的打印机的要点是它需要一个CoreModule并在输出中包含数据构造函数,默认Outputable实现似乎没有.

这是我运行漂亮的打印机的模块的代码:

module Bar2 where

add :: Int -> Int -> Int
add a b = a + b

add2 a b = a + b
Run Code Online (Sandbox Code Playgroud)

这是漂亮的打印机输出:

------------------------------- Module Metadata --------------------------------
Module { "main" :: modulePackageId, "Bar2" :: moduleName }
-------------------------------- Type Bindings ---------------------------------
[r0 :-> Identifier ‘add’, rjH :-> Identifier ‘add2’]
-------------------------------- Core Bindings ---------------------------------
NonRec (Id "add2")
       (Lam (TyVar "a")
            (Lam (Id "$dNum")
                 (Lam (Id "a1")
                      (Lam (Id "b")
                           (App (App (App (App …
Run Code Online (Sandbox Code Playgroud)

haskell types function lambda-calculus ghc

3
推荐指数
2
解决办法
261
查看次数

GHC分析文件和图表是矛盾的

我写了一个Eratosthenes程序的筛子,ST.Strict当我看到它占用了大量的内存时,我正在剖析它:

Sun Jul 10 18:27 2016 Time and Allocation Profiling Report  (Final)

   Primes +RTS -hc -p -K1000M -RTS 10000000

total time  =        2.32 secs   (2317 ticks @ 1000 us, 1 processor)
total alloc = 5,128,702,952 bytes  (excludes profiling overheads)
Run Code Online (Sandbox Code Playgroud)

(其中10 ^ 7)是我要求它生成的素数.

奇怪的是,分析图表显示了完全不同的东西:

剖析图

我在其中一张图中误读了什么吗?或者这些工具之一有什么问题吗?

作为参考,我的代码是

{-# LANGUAGE BangPatterns #-}

import Prelude hiding (replicate, read)
import qualified Text.Read as T
import Data.Vector.Unboxed.Mutable(replicate, write, read)
import Control.Monad.ST.Strict
import Data.STRef
import Control.Monad.Primitive

import Control.Monad

import System.Environment

main = print . length …
Run Code Online (Sandbox Code Playgroud)

profiling haskell ghc

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

期待一种类型,但'Num a'有种'GHC.Prim.Constraint'

我试图以列表形式(例如[3,2,1]为3x ^ 2 + 2x + 1)进行多项式表示,并通过对多项式执行apply和x的数字来对其进行求值.将对x进行多项式求值.

这是我的代码:

newtype Poly a = P [a]

apply :: Num a => Poly a -> Num a -> Num a
apply (P p) x = if (i > 0) then (x * ((head p) ^ i)) + (apply (P (tail p)) x) else p
    where  i = length p
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试编译此代码时,我收到一个我不理解的错误:

期望一个类型,但'Num a'有类'GHC.Prim.Constraint'
在'apply' 的类型签名中:
apply :: Num a => Poly a - > Num a - > Num a

haskell types ghc

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

如何从Haskell程序中访问"+ RTS -s"或其他内存信息?

运行Haskell程序时,+ RTS -s报告诸如"字节最大驻留时间"之类的信息.有没有办法从Haskell程序中访问这些信息?Hackage上有一个提供此功能的库吗?

如果没有,有没有办法访问当前使用的内存量?例如,终端命令"top"显示的数量?

haskell ghc

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

将GHC ByteArray#复制到Ptr

我正在尝试编写以下函数:

memcpyByteArrayToPtr :: 
     ByteArray# -- ^ source
  -> Int -- ^ start
  -> Int -- ^ length
  -> Ptr a -- ^ destination
  -> IO ()
Run Code Online (Sandbox Code Playgroud)

行为应该在内部用于memcpy将a的内容复制ByteArray#Ptr.我有两种技术可以做这样的事情,但我很难推断他们的安全.

第一个是在内存包中找到的.有一个辅助函数withPtr定义为:

data Bytes = Bytes (MutableByteArray# RealWorld)

withPtr :: Bytes -> (Ptr p -> IO a) -> IO a
withPtr b@(Bytes mba) f = do
    a <- f (Ptr (byteArrayContents# (unsafeCoerce# mba)))
    touchBytes b
    return a
Run Code Online (Sandbox Code Playgroud)

但是,我很确定这只是安全的,因为构建的唯一方法Bytes是使用一个调用的智能构造函数newAlignedPinnedByteArray#.给出类似问题和 …

haskell ghc

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

在Where子句中键入规范

作为家庭作业的一部分,我正在尝试做一些非常简单的事情.我需要做的就是编写一个函数,该函数接收表示三角形的基本长度和高度长度的2元组数字列表,并返回与这些三角形对应的区域列表.其中一个要求是我通过定义一个函数并在where子句中声明其类型来实现这一点.到目前为止我尝试的所有东西都无法编译,这就是我所拥有的:

calcTriangleAreas xs = [triArea x | x<-xs]
    where triArea:: (Num, Num) -> Num --this uses 4 preceding spaces 
triArea (base, height) = base*height/2
Run Code Online (Sandbox Code Playgroud)

这失败了The type signature for ‘triArea’ lacks an accompanying binding,这对我来说听起来像triArea没有在where子句中定义.好吧,让我们缩进它以匹配where:

calcTriangleAreas xs = [triArea x | x<-xs]
    where triArea:: (Num, Num) -> Num --this uses 4 preceding spaces 
    triArea (base, height) = base*height/2 --... and so does this
Run Code Online (Sandbox Code Playgroud)

这个无法编译特别无法提供的错误消息parse error on input triArea.只是为了好玩,让我们再尝试缩进它,因为idk还有什么可做的:

calcTriangleAreas xs = [triArea x | …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

使用幻像类型时避免冗余约束

这是我正在尝试编写代码的一个简化的,也许是愚蠢的例子(这更复杂,涉及列表长度的编译时编码).

鉴于以下内容:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}

data D (a :: Bool) where
  D :: Bool -> D a
Run Code Online (Sandbox Code Playgroud)

我想要以下功能g:

g :: D a -> Bool
g (D x) = x == a
Run Code Online (Sandbox Code Playgroud)

当然,这不会编译为a类型,而不是值.

这是一个可能的解决方案:

class C (a :: Bool) where
  f :: D a -> Bool

instance C True where
  f (D x) = x == True

instance C False where
  f (D x) = x == False …
Run Code Online (Sandbox Code Playgroud)

haskell ghc gadt

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

为什么GHC不能推理一些无限的名单?

这个最近的问题让我想到了Haskell使用无限列表的能力.有大量 其他问题,并约在计算器上无限列表答案,我明白了为什么我们不能对所有无限列表的通用解决方案,但为什么不能哈斯克尔推理一些无限列表?

让我们使用第一个链接问题中的示例:

list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
$ [1,2,3,4
Run Code Online (Sandbox Code Playgroud)

@ user2297560在评论中写道:

假装你是GHCI.您的用户会为您提供无限列表,并要求您查找该列表中小于或等于4的所有值.您将如何进行此操作?(请记住,您不知道列表是否有序.)

在这种情况下,用户没有给你一个无限的列表.GHC产生了它!实际上,它是按照自己的规则生成的.该哈斯克尔2010标准规定如下:

enumFrom       :: a -> [a]            -- [n..]  
Run Code Online (Sandbox Code Playgroud)

对于Int和Integer类型,枚举函数具有以下含义:

  • 序列enumFrom e1是列表[ e1,e1+ 1,e1+ 2,...].

在他对另一个问题的回答中,@ chepner写道:

你知道列表是单调递增的,但Haskell没有.

这些用户所做的陈述似乎与我的标准不符.Haskell使用单调增加以有序的方式创建了列表.Haskell 应该知道列表是有序的和单调的.那么为什么不能将这个无限列表自动[x | x <- list1, x <= 4]转化takeWhile (<= 4) list1呢?

haskell list ghc compiler-optimization

3
推荐指数
2
解决办法
161
查看次数

Haskell将Int与Int - > Int混淆

我最近在Haskell遇到了这个奇怪的问题.下面的代码应该返回一个修剪到一个范围的值(如果它在high它之上它应该返回,high如果它在low它下面应该返回low.

inRange :: Int -> Int -> Int -> Int
inRange low high = max low $ min high
Run Code Online (Sandbox Code Playgroud)

错误消息是:

scratch.hs:2:20:
    Couldn't match expected type ‘Int -> Int’ with actual type ‘Int’
    In the expression: max low $ min high
    In an equation for ‘inRange’: inRange low high = max low $ min high

scratch.hs:2:30:
    Couldn't match expected type ‘Int’ with actual type ‘Int -> Int’
    Probable cause: ‘min’ is applied to …
Run Code Online (Sandbox Code Playgroud)

haskell ghc ghci

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