小编cro*_*eea的帖子

将GHC与LLVM 3.2一起使用

我安装了LLVM/opt-3.2以及llvm-3.2.0.2,我刚从Ubuntu软件包安装了GHC 7.6.2.但是,当我尝试使用-fllvm -v3编译ghc时,我收到错误:

*** CodeGen:
*** LlVM CodeGen:
Error (figuring out LLVM version): fd:10: hGetLine: end of file

<no location info>:
    Warning: Couldn't figure out LLVM version!
             Make sure you have installed LLVM
*** LLVM Optimiser:
'opt-3.0' '/tmp/ghc17812_0/ghc17812_0.ll' '-o' '/tmp/ghc17812_0/ghc17812_0.bc' '-mem2reg' '--enable-tbaa=true'
*** Deleting temp files:
...
ghc: could not execute: opt-3.0
Run Code Online (Sandbox Code Playgroud)

opt在我的路径,但版本是3.2,而不是3.0.如果不是hackage llvm包让GHC寻找合适的opt版本,它是什么?

llvm ghc

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

反转类型族

我有一个"线性"类型的家庭,即形式

type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
Run Code Online (Sandbox Code Playgroud)

在我的特定用例中,定义"反向"族FooRev并然后强制执行约束非常方便(FooRev (Foo x) ~ x):

type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
Run Code Online (Sandbox Code Playgroud)

反向族允许GHC推断许多类型,否则这些类型由于非注入性而会是模糊的.这与此处提出的想法基本相同.这个解决方案非常有效,但是通过列出所有情况,必须定义"反向"类型系列,这很烦人,编程和容易出错.是否有更通用的方法来定义线性族的反转,例如Foo

haskell type-families

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

实例的约束推断

考虑以下:

{-# LANGUAGE FlexibleContexts #-}
module Foo where

data D a = D a
class Foo b

instance (Num a) => Foo (D a)

f :: (Foo (D a)) => a -> a
f x = x+1
Run Code Online (Sandbox Code Playgroud)

GHC抱怨它无法推断Num a出来f.我希望从Foofor (非重叠)for的实例推断出这个约束D a.

我知道我可以使用GADT D并在Num a那里添加约束,但我希望不必为了D许多不必要的约束而污染构造函数.这种情况有没有希望发生,现在有可能吗?

haskell ghc

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

向实例添加约束时的奇怪行为

我正在使用语法库来处理AST.我有一些奇怪的行为,我不是正在发生的事情.

{-# LANGUAGE TypeOperators, GADTs, FlexibleInstances,
    FlexibleContexts, UndecidableInstances #-}
module Foo where

import Data.Syntactic
import Data.Syntactic.Functional

data Const a where Const :: Const (Full a)
instance Render Const where renderSym Const = "const"

main :: ASTF Const Int
main = foo $ inj Const

class Foo dom where
  foo :: ASTF dom a -> ASTF dom a

instance --(Const :<: dom) => 
    Foo dom where
  foo node | Just Const <- prj node = error "PASS"
  foo _ …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

7
推荐指数
0
解决办法
102
查看次数

Haskell:为什么这种类型检查?

这是一个取自Reflection-0.5的最小例子.

{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
{-# OPTIONS_GHC -fno-cse -fno-full-laziness -fno-float-in #-}

import Control.Applicative
import Data.Proxy

newtype Zero = Zero Zero deriving (Show)

class ReifiesNum s where
  reflectNum :: Num a => proxy s -> a

instance ReifiesNum Zero where
  reflectNum = pure 0
Run Code Online (Sandbox Code Playgroud)

在GHCi中,我得到以下内容:

>:t Zero
Zero :: Zero -> Zero
Run Code Online (Sandbox Code Playgroud)

这是有道理的:我要求构造函数的类型取零并返回零.

>:t reflectNum
reflectNum :: (ReifiesNum s, Num a) => proxy s -> a
Run Code Online (Sandbox Code Playgroud)

我有可能写出类似的东西

>let x = Just (undefined::Zero)
>reflectNum x
Run Code Online (Sandbox Code Playgroud)

因为类型Just Zero匹配类型变量'proxy s'.

最后,令人困惑的部分: …

reflection haskell typechecking

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

非多态函数的多态签名:为什么不呢?

举个例子,考虑一下琐碎的功能

f :: (Integral b) => a -> b
f x = 3 :: Int
Run Code Online (Sandbox Code Playgroud)

GHC抱怨它不能推断(b~Int).该定义匹配签名,因为它返回的是Integral(即Int).为什么GHC会强迫我使用更具体的类型签名?

谢谢

polymorphism haskell

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

使用Reflection和DataKinds键入推理

我在让GHC在一个显而易见的地方推断类型时遇到了问题.下面是一个完整的片段,展示了这个问题.

{-# LANGUAGE DataKinds, ScopedTypeVariables, KindSignatures, TypeOperators, GADTs #-}

import Data.Reflection
import Data.Proxy
import Data.Tagged

-- heterogeneous list, wrapping kind [*] as *
data HList :: [*] -> * where
              HNil :: HList '[]
              HCons :: a -> HList as -> HList (a ': as)

main = test2

test1 = do
    let x = HCons 3 HNil :: HList '[Int]
        c = case x of (HCons w HNil) -> w
    print c

test2 = reify True (\(_::Proxy a) -> do …
Run Code Online (Sandbox Code Playgroud)

reflection haskell type-inference data-kinds

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

HOAS和FOAS之间的差异

在试图判断EDSL是否对我的项目是谨慎的时候,我阅读了本文本文,描述了meta-repa的实现.他们都提到了HOAS和FOAS.从第一篇论文,

 data FunC a where
  LitI :: Int -> FunC Int
  LitB :: Bool -> FunC Bool
  If :: FunC Bool -> FunC a -> FunC a -> FunC a
  While :: (FunC s -> s -> FunC Bool) -> (FunC s -> FunC s) 
                -> FunC s -> FunC s
  Pair :: FunC a -> FunC b -> FunC (a, b)
  Fst :: FunC (a, b) -> FunC a
  Snd :: FunC (a, b) -> …
Run Code Online (Sandbox Code Playgroud)

haskell abstract-syntax-tree

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

为什么基本的Prelude算法不需要显式类型?

我正在回答一个问题并写了一些代码来完成工作.

isPrime :: Int -> Bool
isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)
Run Code Online (Sandbox Code Playgroud)

我假设需要显式类型签名,如我的回答所述.然后我检查两个GHC和GHCI,发现我并没有需要转换的显式类型,尽管floorsqrt是多态的.我知道GHCi确实做了某种类型的默认,但我在GHC中并不知道.显然,双方FloatDouble会有效的选择在这里,为什么GHC选择了另一种?什么类型是默认的,为什么(大概)GHC默认在这种情况下?

haskell ghc

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

使用非标准Prelude键入默认值

以下程序与GHC编译:

main :: IO ()
main = print $ 2^2
Run Code Online (Sandbox Code Playgroud)

尽管有签名

(^) :: (Num a, Integral b) => a -> b -> a 
Run Code Online (Sandbox Code Playgroud)

由于GHC的类型违约机制.我正在使用数字前奏,而不是导出

(^) :: Ring.C a => a -> Integer -> a
Run Code Online (Sandbox Code Playgroud)

使用Intexponents 非常烦人,所以我更喜欢带有多态指数的Prelude版本.因此,我定义了以下内容:

{-# LANGUAGE NoImplicitPrelude, RebindableSyntax, ScopedTypeVariables #-}

import Algebra.Ring as Ring (C)
import Algebra.ToInteger as ToInteger (C)
import NumericPrelude hiding ((^))

(^) :: forall a i . (Ring.C a, ToInteger.C i) => a -> i -> a
x0 ^ …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

6
推荐指数
0
解决办法
93
查看次数