标签: haskell

使用模板Haskell获取关联的类型同义词

模板Haskell可以找出类型类中声明的关联类型同义词的名称和/或声明吗?我希望reify能做我想做的事,但似乎并没有提供所有必要的信息.它适用于获取函数类型签名:

% ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
...
Prelude> -- I'll be inserting line breaks and whitespace for clarity
Prelude> -- in all GHCi output.
Prelude> :set -XTemplateHaskell 
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> class C a where f :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C)
ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] []
               [SigD Ghci1.f
                     (ForallT [PlainTV a_1627398388]
                              [ClassP Ghci1.C [VarT a_1627398388]]
                              (AppT (AppT ArrowT (VarT a_1627398388))
                                    (ConT GHC.Types.Int)))])
       [] …
Run Code Online (Sandbox Code Playgroud)

haskell type-families reify template-haskell associated-types

256
推荐指数
1
解决办法
5501
查看次数

Template Haskell有什么不好的?

似乎模板Haskell经常被Haskell社区视为一种​​不幸的便利.我很难准确地说出我在这方面所观察到的内容,但请考虑这几个例子

我已经看过各种博客文章,其中人们使用模板Haskell做了相当简洁的东西,实现了更好的语法,这在常规的Haskell中是不可能的,以及巨大的样板减少.那么为什么模板Haskell以这种方式受到鄙视呢?是什么让它不受欢迎?在什么情况下应避免模板Haskell,为什么?

haskell template-haskell

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

感叹号在Haskell声明中意味着什么?

当我尝试使用真实项目来驱动Haskell时,我遇到了以下定义.我不明白每个论点前面的感叹号是什么意思,我的书似乎没有提到它.

data MidiMessage = MidiMessage !Int !MidiMessage
Run Code Online (Sandbox Code Playgroud)

syntax haskell lazy-evaluation

246
推荐指数
3
解决办法
3万
查看次数

比较Haskell的Snap和Yesod Web框架

最近新闻中的两个Haskell网络框架是Yesod(0.8)和Snap(0.4).

很明显,Yesod目前支持的功能远远多于Snap.但是,我无法忍受Yesod用于其HTML,CSS和Javascript的语法.

所以,如果我选择使用Snap,我想了解我会失踪的内容.例如,看起来不像数据库支持那样.会议怎么样?其他特性?

haskell web-frameworks yesod haskell-snap-framework

231
推荐指数
4
解决办法
3万
查看次数

为什么Haskell(GHC)如此快速?

Haskell(使用GHC编译器)比你期望的要快很多.如果使用得当,它可以与低级语言保持密切联系.(Haskellers最喜欢的事情是尝试在C的5%范围内(或者甚至击败它,但这意味着你使用的是低效的C程序,因为GHC将Haskell编译为C).)我的问题是,为什么?

Haskell是声明性的,基于lambda演算.机器架构显然势在必行,粗略地基于图灵机.实际上,Haskell甚至没有具体的评估顺序.此外,您不必处理机器数据类型,而是始终生成代数数据类型.

最奇怪的是更高阶函数.你会认为动态创建函数并抛出它们会使程序变慢.但是使用更高阶函数实际上使Haskell更快.实际上,似乎要优化Haskell代码,你需要使它更优雅和抽象,而不是更像机器.如果Haskell的更高级功能没有改进,它们似乎甚至都不会影响它的性能.

很抱歉,如果这听起来不错,但这是我的问题:为什么Haskell(使用GHC编译)如此之快,考虑到它的抽象性质和与物理机器的差异?

注意:我说C和其他命令式语言有点类似于图灵机的原因(但不是Haskell类似于Lambda微积分)是因为在命令式语言中,你有一个有限数量的状态(也就是行号) ,以及磁带(ram),以便状态和当前磁带确定对磁带做什么.有关从图灵机到计算机的过渡,请参阅维基百科条目,图灵机等效项.

performance haskell lambda-calculus ghc higher-order-functions

223
推荐指数
3
解决办法
4万
查看次数

Haskell:列表,数组,向量,序列

我正在学习Haskell,并阅读了几篇关于Haskell列表和(插入语言)数组的性能差异的文章.

作为一个学习者,我显然只是在不考虑性能差异的情况下使用列表.我最近开始调查,发现Haskell中有许多数据结构库.

有人可以解释一下列表,数组,向量,序列之间的区别,而不是深入研究数据结构的计算机科学理论吗?

此外,是否有一些常见的模式,您将使用一个数据结构而不是另一个?

是否有任何其他形式的数据结构我缺少并可能有用?

haskell

221
推荐指数
1
解决办法
3万
查看次数

什么是Haskell对Node.js的响应?

我相信Erlang社区并不羡慕Node.js,因为它本身可以进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(甚至没有内置在Node.js中).有关详情,请访问http://journal.dedasys.com/2010/04/29/erlang-vs-node-jsNode.js或Erlang

那么Haskell呢?Haskell能否提供Node.js的一些好处,即一个干净的解决方案,以避免在不使用多线程编程的情况下阻止I/O?


Node.js有很多吸引人的东西

  1. 事件:没有线程操作,程序员只提供回调(如在Snap框架中)
  2. 保证回调在单个线程中运行:不存在竞争条件.
  3. 简单易用的UNIX友好API.好处:优秀的HTTP支持.DNS也可用.
  4. 默认情况下,每个I/O都是异步的.这样可以更容易地避免锁定.但是,回调中过多的CPU处理会影响其他连接(在这种情况下,任务应分成较小的子任务并重新调度).
  5. 客户端和服务器端的语言相同.(但是我没有看到这个值太多了.jQuery和Node.js共享事件编程模型,但其余部分非常不同.我只是看不出服务器端和客户端之间的共享代码如何在实践中很有用.)
  6. 所有这些都包装在一个产品中.

concurrency multithreading haskell node.js

215
推荐指数
6
解决办法
5万
查看次数

什么时候-XAllowAmbiguousTypes合适?

我最近发布了一个问题,关于句法2.0有关的定义share.我在GHC 7.6中有这个工作:

{-# LANGUAGE GADTs, TypeOperators, FlexibleContexts #-}

import Data.Syntactic
import Data.Syntactic.Sugar.BindingT

data Let a where
    Let :: Let (a :-> (a -> b) :-> Full b)

share :: (Let :<: sup,
          sup ~ Domain b, sup ~ Domain a,
          Syntactic a, Syntactic b,
          Syntactic (a -> b),
          SyntacticN (a -> (a -> b) -> b) 
                     fi)
           => a -> (a -> b) -> b
share = sugarSym Let
Run Code Online (Sandbox Code Playgroud)

但是,GHC 7.8希望-XAllowAmbiguousTypes …

haskell ghc

212
推荐指数
1
解决办法
6070
查看次数

在Android OS上运行Haskell程序

前言:这是在/ r/haskell上启动的线程的扩展

让我们从事实开始:

  • Android是一个很棒的操作系统
  • Haskell是这个星球上最好的编程语言

因此,很明显,将它们结合起来可以使Android开发更好.所以基本上我只想知道如何为Android OS编写Haskell程序.我的问题是:

如何在Android OS上执行/运行Haskell程序?

executable android haskell

210
推荐指数
6
解决办法
3万
查看次数

不是Functor/Functor/Applicative/Monad的好例子?

在向某人解释什么是类型类X时,我很难找到正好是X的数据结构的好例子.

所以,我请求示例:

  • 一个不是Functor的类型构造函数.
  • 一个类型构造函数,它是一个Functor,但不是Applicative.
  • 一个类型构造函数,它是Applicative,但不是Monad.
  • Monad的类型构造函数.

我认为Monad到处都有很多例子,但Monad的一个很好的例子与之前的例子有一些关系可以完成图片.

我寻找彼此相似的示例,区别仅在于属于特定类型类的重要方面.

如果有人能够设法在这个层次结构的某个地方隐藏一个Arrow的例子(它是在Applicative和Monad之间吗?),那也会很棒!

monads haskell functor applicative

202
推荐指数
5
解决办法
1万
查看次数