我看到这经常用于使模块与GHC和Hugs兼容,但谷歌并没有帮助我更多地了解它.
我可以在条件中加入什么?我可以根据正在使用的"基础"版本来制作模块的一部分吗?
编辑3/2017:这是一个很好的资源:https://guide.aelve.com/haskell/cpp-vww0qd72
当我意识到这一点时,哈斯克尔再次震惊了我的思绪
(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内手动完全重建?如果你放弃了前奏而从不导入任何东西,你还有什么可以继续使用?
看起来好像我问了一百万个问题,但他们真的都试图用不同的措辞问同样的问题.给你最好的拍摄!
玩一些代码:
{-# 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) 我试图通过搜索网页来了解FlexibleContexts扩展正在做什么,这些网页可以解释为凡人(例如,像我一样读过LYHFGG的人),但我没有找到任何这样的资源.
因此,我向专家们询问这个话题:有人可以解释一下这个扩展的作用,它为什么存在,并给出一两个简单的例子,说明如何以及为什么要使用它?
此外,如果我读别人的代码,其使用这个扩展名,那我怎么知道,以了解使用此扩展编写的代码扩展?
有没有办法,无论是标准的还是聪明的黑客,在文件上调用GHC只运行类型检查器?例如
$ ghc --just-check-the-types x.hs
$
Run Code Online (Sandbox Code Playgroud)
没有输出文件,没有.hi或.o等.不想/不能使用GHC API.这里只是谈论命令行程序.
由于这些灵活的上下文和实例在Haskell标准中不可用,我认为在使用它们时存在潜在的问题.这些是什么?它们会导致一些含糊不清,不可判断,重叠的实例等吗?
有一个类似的问题只是问FlexibleInstances,不是FlexibleContexts,但答案只说"使用它们是安全的".
总(功能)语言是可以显示所有内容终止的语言.显然,有很多地方我不想要这个 - 抛出异常有时很方便,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)运行时成本到免费.那么,现在我的问题:
显然,这样的检查是保守的,所以每当GHC不确定某些东西是完全的(或者是懒得检查)时,它可能会认为它不是......在我看来,拼凑一个不是 - 可能并不太难如此智能的检查器仍然非常有用(至少它应该是直截了当地消除我所有的算术证明).然而,我似乎无法找到任何努力在GHC中构建这样的东西,所以显然我错过了一些非常大的限制.来吧,粉碎我的梦想.:)
相关但不是最近的:2005年尼尔米切尔解散Haskell.
我已经使用了ghci调试器,但是如果它与文本编辑器有点集成以简化设置断点的过程,我会更喜欢.它可能不应该严格评估每个可见变量,但至少可以简化查看本地状态的过程.
我最近发现了跟踪功能,它允许从其他困难的地方调试打印输出.
让我们考虑以下代码段:
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?
显然,这只是一个示例,而不是类型声明的真实用例.
我正在研究基于约束的搜索的自动边界.因此,我的出发点是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)