标签: ghc

过滤器foo的内存使用情况[2..n] !! 0

假设我有以下功能

small_div :: Int -> Int
small_div n = filter (\x -> n `rem` x == 0) [2..n] !! 0
Run Code Online (Sandbox Code Playgroud)

这个函数的内存使用情况是多少?等效的C代码将是恒定的内存使用量,我相信Haskell的懒惰评估意味着它不会创建[2..n]的更多元素而不是找到第一个除数所需的元素,但ghc足够聪明才能进行跳转像...这样的东西

int small_div(int n) {
    for (int x = 2; x <= n; x++) {
        if (n % x == 0) {
            return x;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

我可以完全禁用GHC上的类型检查,以便将其用作函数式语言的编译目标吗?

GHC在这一点上的速度惊人地快.不过,我对Haskell的类型系统不满意,所以我决定将自己的系统作为DSL来实现.现在,我想通过翻译后检查无类型lambda演算表达式来编译我的语言到Haskell,以便使用GHC的性能.唯一的问题是我的系统上的某些有效表达式无法在GHC上编译.我怎样才能避免这个问题 - 即通过告诉GHC完全禁用类型系统"我已经检查了这个,相信我"?

haskell types compilation ghc

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

使用GHC Generics时,参数类型错误

我一直在关注GHC.Generics教程,制作一个简单的通用类型类,为任意类型提供默认值.但是,当我尝试加载我的文件(相关片段,仍然产生错误)

{-# LANGUAGE DefaultSignatures, DeriveGeneric, TypeOperators, FlexibleContexts #-}
import GHC.Generics

class Default a where
    def :: a
    default def :: (Generic a, GDefault (Rep a)) => a
    def = to gdef

class GDefault f where
    gdef :: f a

instance (Default a, Default b) => GDefault (a :+: b) where
    gdef (L1 x) = gdef x
    gdef (R1 x) = gdef x
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Generic.hs:12:46:
    The first argument of ‘:+:’ should have kind ‘* -> *’,
      but ‘a’ has …
Run Code Online (Sandbox Code Playgroud)

haskell types typeclass ghc

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

GHC抱怨重叠实例,实际上它们不是

我有这样toAVector定义的函数:

class Elt a => ToAVector v a where
  toAVector :: v a -> A.Array DIM1 a

instance Elt a => ToAVector [] a where
  toAVector l =
    A.fromList (Z :. P.length l) l

instance (Elt a, G.Vector v a) => ToAVector v a where
  toAVector v =
    A.fromFunction (Z :. G.length v) (\(Z :. i) -> v G.! i)
  {-# INLINE toAVector #-}
Run Code Online (Sandbox Code Playgroud)

当试图toAVector在另一个库中使用时,我收到错误:

Overlapping instances for ToAVector [] Double
  arising from a use of …
Run Code Online (Sandbox Code Playgroud)

haskell ghc instances

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

如何在生成的代码中禁止警告?

我正在和Alex和Happy一起构建一个词法分析器和解析器.他们生成的代码ghc-options: -Wall在我的项目的.cabal文件中打开时会抛出大量的警告.

这使得很难捕捉到真正的警告.如何仅在生成的文件中关闭警告?我知道可以用pragma完成:

{#- GHC_OPTIONS -w -#}
Run Code Online (Sandbox Code Playgroud)

但是我想不出一个简单的方法可以在每次生成的文件的顶部粘贴这个pragma,每次重建它们.

这样做的正确方法是什么?

haskell compiler-warnings ghc generated-code

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

realWorld#在哪里定义?

unsafeDupablePerformIO(来源,文档)的定义中,我找到了对唯一的引用realWorld#.所以我想知道所有这些以a结尾的函数或值是在哪里#定义的?我已经找到了GHC primops课程:它们包括seq#,catch#,retry#,和所有其他类型的有趣功能.它还包含一种RealWorld类型.但是这些初学者似乎并没有包含实际价值realWorld#.

{-# NOINLINE unsafeDupablePerformIO #-}
    -- See Note [unsafeDupablePerformIO is NOINLINE]
unsafeDupablePerformIO  :: IO a -> a
unsafeDupablePerformIO (IO m) = lazy (case m realWorld# of (# _, r #) -> r)
     -- See Note [unsafeDupablePerformIO has a lazy RHS]
Run Code Online (Sandbox Code Playgroud)

(请不要混合RealWorldrealWorld#:第一个是类型,第二个是值.)

GHC还有其他未记载的初学者吗?或者也许所有这些都记录在某处,我还没有找到它?我可以在GHC源中查看这些内容的实现情况吗?

haskell ghc

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

将-XGeneralizedNewtypeDeriving与-XMultiParamTypeClasses一起使用

以下代码导致错误:

{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses, StandaloneDeriving #-}

class Module a b where
    (*>) :: a -> b -> b

data D
newtype DWrapper = DW D    
instance Module D D    
deriving instance Module DWrapper DWrapper
Run Code Online (Sandbox Code Playgroud)

错误:

No instance for (Module DWrapper D) arising from a use of ‘Main.*>’
In the first argument of ‘GHC.Prim.coerce’, namely
  ‘(Main.*>) :: DWrapper -> D -> D’
In the expression:
    GHC.Prim.coerce ((Main.*>) :: DWrapper -> D -> D) ::
      DWrapper -> DWrapper -> DWrapper
In …
Run Code Online (Sandbox Code Playgroud)

haskell ghc derived-instances

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

getLine不会停止

我的程序就像是

main :: IO String
main = do
  putStrLn "input a"
  a <- getChar
  putStrLn "input b"
  b <- getLine
  putStrLn "input c"
  c <- getChar
  return a:c:b
Run Code Online (Sandbox Code Playgroud)

行为:打印出"输入a",程序等待我键入Char并按回车键.从那里,它滚过getLine而不让我输入一些东西.我怎样才能让它按照我的意图去做呢?

PS:这段代码可能存在更多问题,但让我们关注我目前的问题.

haskell user-input ghc

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

为什么在`accursedUnutterablePerformIO`中没有`seq`?

为什么accursedUnutterablePerformIO(又名inlinePerformIO)实施

accursedUnutterablePerformIO :: IO a -> a
accursedUnutterablePerformIO (IO a) = case a realWorld# of (# _, r #) -> r
Run Code Online (Sandbox Code Playgroud)

并不是

accursedUnutterablePerformIO :: IO a -> a
accursedUnutterablePerformIO (IO a) = case a realWorld# of (# s, r #) -> s `seq` r
Run Code Online (Sandbox Code Playgroud)

haskell ghc unsafe-perform-io

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

为什么不存在量化和数据合作?

{-# LANGUAGE DataKinds, ExistentialQuantification, KindSignatures #-}
import Data.Proxy

data Type t= forall (a :: t). Type (Proxy a)
Run Code Online (Sandbox Code Playgroud)

给出了错误

Type variable ‘t’ used in a kind
In the kind ‘t’
In the definition of data constructor ‘Type’
In the data declaration for ‘Type’
Run Code Online (Sandbox Code Playgroud)

但是t是一个Kind变量,而不是一个类型变量.这是怎么回事?

haskell existential-type ghc dependent-type data-kinds

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