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
初始点:
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和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分钟).这是一个耻辱,我的包实际上相当小,我想如果安装可以很快.任何人都知道具有较小依赖性的解决方案?
直到最近,我正在执行这个美容来构建+运行堆栈的项目:
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......
我最近在某处读过模式匹配在运行时发生而不是编译时.(我正在寻找源,但目前无法找到它.)这是真的吗?如果是这样,功能中的警卫是否具有相同的性能?
阅读这个对我来说是令人惊讶的,因为我曾经认为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)
执行f并f'编译为相同数量的指令(例如,在Core和/或更低版本中)?
如果我在构造函数上模式匹配而不是值,情况是否有所不同?例如,如果GHC发现始终使用一个构造函数调用某个位置的函数,它是否会以消除运行时检查的方式优化该调用?如果是这样,你能给我一个展示优化产生的例子的例子吗?
在性能方面有什么值得了解的这两种方法?
什么时候表现更好?
我是一个很新的堆栈,想知道是否git commit或.gitignore该文件.
这两种选择的含义是什么?
我的意思是这样的:
echo 'main = print 1' | ghc > executable
Run Code Online (Sandbox Code Playgroud)
GHC回复: ghc: no input files
我错过了什么吗?这有可能吗?
例如:
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)
即使目前没有这样的东西,是否有可能写出类似的东西?
我最初是这样尝试的:
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) 我可以以某种方式声明自定义数字类型吗?例如,我想要一个UnixMsDate和一个UnixSDate类型,我想如果TS可以帮助我总是区分和消除这两者之间的歧义,这意味着我从不会意外混淆它们.虽然能够明确地在它们之间(和/从数字)进行转换.
我试过type UnixMsDate = number并编译,但它似乎只是数字的可互换别名.
我正在寻找什么可能吗?