小编Wiz*_*zek的帖子

有没有办法让GHC提供类型孔的类型类约束?

目前的行为

Prelude> show _

<interactive>:7:6:
    Found hole ‘_’ with type: a0
    Where: ‘a0’ is an ambiguous type variable
    Relevant bindings include it :: String (bound at <interactive>:7:1)
    In the first argument of ‘show’, namely ‘_’
    In the expression: show _
    In an equation for ‘it’: it = show _
Run Code Online (Sandbox Code Playgroud)

期望的行为

如果GHC还告诉我输入的孔具有Show类型类约束,那将是很好的.

杂项

GHC版本7.8.1

haskell types ghc

102
推荐指数
1
解决办法
1867
查看次数

如何在Haskell中部分定义函数签名?

初始点:

fn :: [a] -> Int
fn = (2 *) . length
Run Code Online (Sandbox Code Playgroud)

比方说,我们只是想约束的返回值,那么我们可以这样写:

fn list = (2 * length list) :: Int
Run Code Online (Sandbox Code Playgroud)

如何限制参数?简单.

fn list = 2 * length (list :: [Char])
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但最好是收集顶部的签名而不是散布在函数体周围.

这是我能得到的最接近的:

fnSig = undefined :: [Char] -> a
fn | False = fnSig
   | True  = (* 2) . length
Run Code Online (Sandbox Code Playgroud)

基于http://okmij.org/ftp/Haskell/partial-signatures.lhs通过http://okmij.org/ftp/Haskell/types.html#partial-sigs

但是,我想要一个更清洁的解决方案.更好地沟通的东西,我的意图是部分限制.像这样的东西,例如:

fn :: [Char] -> a
fn = (2 *) . length
Run Code Online (Sandbox Code Playgroud)

或者可能:

fn :: [Char] -> _
fn …
Run Code Online (Sandbox Code Playgroud)

haskell

46
推荐指数
4
解决办法
2699
查看次数

模板Haskell:是否有解析String并返回Q Exp的函数(或特殊语法)?

我正在尝试学习一些模板Haskell和Quasi Quotation,我正在寻找一个函数,它接受String并解析它Q Exp,所以类型是:

String -> Q Exp
Run Code Online (Sandbox Code Playgroud)

尝试搜索hoogle,但我看到的结果与提升字符串文字有关Q Exp,而我找到的最接近的Language.Haskell.TH.dyn是我想要的,但仅适用于单个变量.

还有其他选择吗?例如一个特殊的语法?我只是在自己熟悉的过程中[||]$(),所以也许也有一些是为了这个目的呢?

我想象它会起作用的一个例子:

runQ (parse "(1+)") == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing
Run Code Online (Sandbox Code Playgroud)

另外,我知道这一点

runQ [| (1+) |] == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing
Run Code Online (Sandbox Code Playgroud)

但这不适用于变量字符串,因为 - 可以理解 - 里面的字符串被视为文字.

runQ [| "(1+)" |] == LitE (StringL "(1+)")
Run Code Online (Sandbox Code Playgroud)

编辑(2015-07-25):我已经开始使用了haskell-src-meta,到目前为止似乎运行良好.但是它需要相当长的时间cabal install(我的机器上大约10分钟).这是一个耻辱,我的包实际上相当小,我想如果安装可以很快.任何人都知道具有较小依赖性的解决方案?

haskell template-haskell

20
推荐指数
1
解决办法
759
查看次数

有没有类似于`cabal run`的`stack run`?

直到最近,我正在执行这个美容来构建+运行堆栈的项目:

stack build && .stack-work/install/x86_64-linux/lts-4.1/7.10.3/bin/<project-name>
Run Code Online (Sandbox Code Playgroud)

IRC告诉我,这可以简化为

stack build && stack exec <project-name>
Run Code Online (Sandbox Code Playgroud)

这可以进一步简化

stack run
Run Code Online (Sandbox Code Playgroud)

或至少

stack run <project-name>
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,这是可能的cabal run.

编辑:

@ haoformayor的评论越来越近了:

alias b='stack build --fast --ghc-options="-Wall" && stack exec'
Run Code Online (Sandbox Code Playgroud)

虽然这还需要项目名称,对吗?

我也开始接近了

function stack-run () { stack build && stack exec `basename "$PWD"` }
Run Code Online (Sandbox Code Playgroud)

虽然这仅在项目名称与文件夹名称匹配时才有效.也许我们可以查询executable.cabal文件中第一个条目的cabal/stack ?或者也许我们可以用sed......

haskell stackage

15
推荐指数
3
解决办法
5276
查看次数

模式匹配是否比守卫更高效?

我最近在某处读过模式匹配在运行时发生而不是编译时.(我正在寻找源,但目前无法找到它.)这是真的吗?如果是这样,功能中的警卫是否具有相同的性能?

阅读这个对我来说是令人惊讶的,因为我曾经认为GHC能够在编译期间优化一些(可能不是全部)模式匹配决策.这会发生吗?

一个案例例如:

f 1 = 3
f 2 = 4
Run Code Online (Sandbox Code Playgroud)

VS

f' a | a == 1 = 3
     | a == 2 = 4
Run Code Online (Sandbox Code Playgroud)

执行ff'编译为相同数量的指令(例如,在Core和/或更低版本中)?

如果我在构造函数上模式匹配而不是值,情况是否有所不同?例如,如果GHC发现始终使用一个构造函数调用某个位置的函数,它是否会以消除运行时检查的方式优化该调用?如果是这样,你能给我一个展示优化产生的例子的例子吗?

综上所述

在性能方面有什么值得了解的这两种方法?

什么时候表现更好?

haskell ghc

12
推荐指数
1
解决办法
693
查看次数

stack.yaml文件应该被检入版本控制吗?

我是一个很新的堆栈,想知道是否git commit.gitignore该文件.

这两种选择的含义是什么?

haskell haskell-stack

11
推荐指数
1
解决办法
435
查看次数

是否可以通过标准输入将源代码传递给GHC?

我的意思是这样的:

echo 'main = print 1' | ghc > executable
Run Code Online (Sandbox Code Playgroud)

GHC回复: ghc: no input files

我错过了什么吗?这有可能吗?

haskell ghc

10
推荐指数
2
解决办法
405
查看次数

是否有(模板)Haskell库允许我使用各自的名称打印/转储一些本地绑定?

例如:

let x = 1 in putStrLn [dump|x, x+1|]
Run Code Online (Sandbox Code Playgroud)

会印出类似的东西

x=1, (x+1)=2
Run Code Online (Sandbox Code Playgroud)

即使目前没有这样的东西,是否有可能写出类似的东西?

haskell template-haskell

9
推荐指数
2
解决办法
411
查看次数

使用Nix,如何在启用性能分析的情况下指定Haskell依赖项?

我最初是这样尝试的:

nix-shell -p "haskell.packages.ghc821.ghcWithPackages (p: with p; [text hspec lens])" -j4 --run 'ghc Main.hs -prof
Run Code Online (Sandbox Code Playgroud)

然后GHC告诉我

Main.hs:4:1: error:
    Could not find module ‘Control.Lens’
    Perhaps you haven't installed the profiling libraries for package ‘lens-4.15.4’?
    Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)

在网上搜索我发现了这个:https://github.com/NixOS/nixpkgs/issues/22340

所以我似乎无法从缓存中下载.但是没关系,如果至少我可以在本地构建配置文件变体.

我可以通过简单地修改给定的nix表达式以某种方式做到这-p一点吗?

然后在写这个问题的这一点上,我记得这个资源:https://github.com/NixOS/nixpkgs/blob/bd6ba7/pkgs/development/haskell-modules/lib.nix

我找到的地方enableLibraryProfiling.所以我尝试过:

nix-shell -p "haskell.packages.ghc821.ghcWithPackages (p: with p; [text hspec (haskell.lib.enableLibraryProfiling lens)])" -j4 --run 'ghc Main.hs -prof'
Run Code Online (Sandbox Code Playgroud)

这让我遇到了一个新错误:

src/Control/Lens/Internal/Getter.hs:26:1: error:
    Could not find …
Run Code Online (Sandbox Code Playgroud)

haskell nix

7
推荐指数
1
解决办法
641
查看次数

我可以在TypeScript中声明自定义数字类型吗?

我可以以某种方式声明自定义数字类型吗?例如,我想要一个UnixMsDate和一个UnixSDate类型,我想如果TS可以帮助我总是区分和消除这两者之间的歧义,这意味着我从不会意外混淆它们.虽然能够明确地在它们之间(和/从数字)进行转换.

我试过type UnixMsDate = number并编译,但它似乎只是数字的可互换别名.

我正在寻找什么可能吗?

typescript

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