我安装了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版本,它是什么?
我有一个"线性"类型的家庭,即形式
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?
考虑以下:
{-# 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许多不必要的约束而污染构造函数.这种情况有没有希望发生,现在有可能吗?
我正在使用语法库来处理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) 这是一个取自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'.
最后,令人困惑的部分: …
举个例子,考虑一下琐碎的功能
f :: (Integral b) => a -> b
f x = 3 :: Int
Run Code Online (Sandbox Code Playgroud)
GHC抱怨它不能推断(b~Int).该定义匹配签名,因为它返回的是Integral(即Int).为什么GHC会强迫我使用更具体的类型签名?
谢谢
我在让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) 在试图判断EDSL是否对我的项目是谨慎的时候,我阅读了本文和本文,描述了meta-repa的实现.他们都提到了HOAS和FOAS.从第一篇论文,
Run Code Online (Sandbox Code Playgroud)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) -> …
我正在回答一个问题并写了一些代码来完成工作.
isPrime :: Int -> Bool
isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)
Run Code Online (Sandbox Code Playgroud)
我假设需要显式类型签名,如我的回答所述.然后我检查两个GHC和GHCI,发现我并没有需要转换的显式类型,尽管floor和sqrt是多态的.我知道GHCi确实做了某种类型的默认,但我在GHC中并不知道.显然,双方Float并Double会有效的选择在这里,为什么GHC选择了另一种?什么类型是默认的,为什么(大概)GHC默认在这种情况下?
以下程序与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)
(^) :: 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)