标签: ghc

我在哪里可以了解#ifdef?

我看到这经常用于使模块与GHC和Hugs兼容,但谷歌并没有帮助我更多地了解它.

我可以在条件中加入什么?我可以根据正在使用的"基础"版本来制作模块的一部分吗?

编辑3/2017:这是一个很好的资源:https://guide.aelve.com/haskell/cpp-vww0qd72

haskell ghc c-preprocessor

35
推荐指数
3
解决办法
8500
查看次数

Haskell元组构造函数(GHC)和语言及其实现之间的分离

当我意识到这一点时,哈斯克尔再次震惊了我的思绪

(x,y)
Run Code Online (Sandbox Code Playgroud)

只是语法糖

(,) x y
Run Code Online (Sandbox Code Playgroud)

当然我想把它扩展到更大的元组.但

(,) x ((,) y z)
Run Code Online (Sandbox Code Playgroud)

给我

(x,(y,z))
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.一时兴起,我试过了

(,,) x y z
Run Code Online (Sandbox Code Playgroud)

它有效,给出我想要的东西:

(x,y,z)
Run Code Online (Sandbox Code Playgroud)

这提出了一个问题:你能走多远?令我惊讶的是,似乎没有任何限制.以下所有都是有效的运营商:

(,)
(,,)
(,,,)
(,,,,)
--etc
(,,,,,,,,,,,,,,)
(,,,,,,,,,,,,,,,)
--etc
(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
--etc
Run Code Online (Sandbox Code Playgroud)

这种行为是惊人的,并导致我的实际问题:它是否可以在我自己的功能中模拟?或者它只是元组运算符的GHC特定功能?我认为它是后者,因为我已经阅读了haskell98规范和iirc它说实现只需要为最多15个项目定义元组运算符.而GHC已经全力以赴,让你可以达到任意限制.

那么,是否可以在haskell实现本身中定义这个运算符/函数族,只使用类型系统和现有语言特性(声明,类型签名,函数定义等)?如果是这样,怎么样?或者这是不可能的,你必须考虑编译器来找到这个函数集合的支持框架?

这导致了一个更普遍的问题:Haskell本身支持多少Haskell,通过类型和函数定义,声明等; 以及编译器/实现支持多少?(我知道GHC是用Haskell编写的,但没有回答这个问题)

也就是说,如果你放弃标准库(包括前奏)并在原始的Haskell中从头开始做所有事情; 是否可以使用GHC的所有功能构建一个完整的实现,只使用最少的一组功能?为了使用Haskell构建haskell实现,您需要哪些最小的语言功能集?我是否可以放弃前奏,然后在GHC内手动完全重建?如果你放弃了前奏而从不导入任何东西,你还有什么可以继续使用?

看起来好像我问了一百万个问题,但他们真的都试图用不同的措辞问同样的问题.给你最好的拍摄!

haskell functional-programming tuples comma ghc

35
推荐指数
1
解决办法
5025
查看次数

IncoherentInstances如何运作?

一些代码:

{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}

class Arity f where
  arity :: f -> Int

instance Arity x where
  arity _ = 0

instance Arity f => Arity ((->) a f) where
  arity f = 1 + arity (f undefined)
Run Code Online (Sandbox Code Playgroud)

没有IncoherentInstances:

ghci> arity foldr
blah blah ambiguous blah blah possible fix blah
ghci> arity (foldr :: (a -> Int -> Int) -> Int -> [a] -> Int)
3
ghci> let f x y = 3 in …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass ghc

35
推荐指数
1
解决办法
2715
查看次数

什么是FlexibleContexts扩展适合?你能用一个简单的例子解释一下吗?

我试图通过搜索网页来了解FlexibleContexts扩展正在做什么,这些网页可以解释为凡人(例如,像我一样读过LYHFGG的人),但我没有找到任何这样的资源.

因此,我向专家们询问这个话题:有人可以解释一下这个扩展的作用,它为什么存在,并给出一两个简单的例子,说明如何以及为什么要使用它?

此外,如果我读别人的代码,其使用这个扩展名,那我怎么知道,以了解使用此扩展编写的代码扩展?

haskell ghc

35
推荐指数
3
解决办法
9144
查看次数

让GHC只进行型式检查?

有没有办法,无论是标准的还是聪明的黑客,在文件上调用GHC只运行类型检查器?例如

$ ghc --just-check-the-types x.hs
$
Run Code Online (Sandbox Code Playgroud)

没有输出文件,没有.hi或.o等.不想/不能使用GHC API.这里只是谈论命令行程序.

haskell ghc

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

使用FlexibleContexts和FlexibleInstances有哪些陷阱?

由于这些灵活的上下文和实例在Haskell标准中不可用,我认为在使用它们时存在潜在的问题.这些是什么?它们会导致一些含糊不清,不可判断,重叠的实例等吗?

有一个类似的问题只是问FlexibleInstances,不是FlexibleContexts,但答案只说"使用它们是安全的".

haskell ghc language-extension

34
推荐指数
1
解决办法
4652
查看次数

什么是Haskell缺少整体检查?

总(功能)语言是可以显示所有内容终止的语言.显然,有很多地方我不想要这个 - 抛出异常有时很方便,Web服务器不应该终止等等.但有时候,我希望进行本地整体检查以启用某些优化.例如,如果我有一个可证明的全部功能

commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...
Run Code Online (Sandbox Code Playgroud)

然后,由于:~:只有一个居民(Refl),GHC可以优化

gcastWith (commutativity @n @m) someExpression
  ==>
someExpression
Run Code Online (Sandbox Code Playgroud)

我的可交换性证明从O(n)运行时成本到免费.那么,现在我的问题:

为Haskell制作总体检查器有哪些微妙的困难?

显然,这样的检查是保守的,所以每当GHC不确定某些东西是完全的(或者是懒得检查)时,它可能会认为它不是......在我看来,拼凑一个不是 - 可能并不太难如此智能的检查器仍然非常有用(至少它应该是直截了当地消除我所有的算术证明).然而,我似乎无法找到任何努力在GHC中构建这样的东西,所以显然我错过了一些非常大的限制.来吧,粉碎我的梦想.:)


相关但不是最近的:2005年尼尔米切尔解散Haskell.

haskell types proof ghc dependent-type

34
推荐指数
1
解决办法
2651
查看次数

调试haskell代码的好方法是什么?

我已经使用了ghci调试器,但是如果它与文本编辑器有点集成以简化设置断点的过程,我会更喜欢.它可能不应该严格评估每个可见变量,但至少可以简化查看本地状态的过程.

我最近发现了跟踪功能,它允许从其他困难的地方调试打印输出.

debugging haskell ghc

33
推荐指数
3
解决办法
8181
查看次数

如何与外部语境中的类型相关联

让我们考虑以下代码段:

blah :: a -> b -> a
blah x y = ble x where
    ble :: b -> b
    ble x = x
Run Code Online (Sandbox Code Playgroud)

这在GHC下编译得很好,这实际上意味着b第3行b与第一行不同.

我的问题很简单:有没有办法以某种方式将类型声明与ble外部上下文中使用的类型相关联,即类型声明blah

显然,这只是一个示例,而不是类型声明的真实用例.

haskell types functional-programming ghc type-declaration

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

在GHC编译的二进制文件中使用过多的神秘系统时间

我正在研究基于约束的搜索的自动边界.因此,我的出发点是SEND MORE MONEY问题,基于非确定性选择解决方案无需替换.我已经修改了方法来计算执行的样本数量,以便更好地衡量添加约束对搜索的影响.

import Control.Monad.State
import Control.Monad.Trans.List
import Control.Monad.Morph
import Data.List (foldl')

type CS a b = StateT [a] (ListT (State Int)) b

select' :: [a] -> [(a, [a])]
select' [] = []
select' (x:xs) = (x, xs) : [(y, x:ys) | ~(y, ys) <- select' xs]

select :: CS a a
select = do
    i <- lift . lift $ get
    xs <- get
    lift . lift . put $! i + length …
Run Code Online (Sandbox Code Playgroud)

linux performance haskell virtual-machine ghc

33
推荐指数
1
解决办法
367
查看次数