Cabal允许自由形态稳定性字段:
稳定性:自由形态
包装的稳定性水平,例如
alpha
,experimental
,provisional
,stable
.
关于这些稳定性价值观的社区惯例是什么?考虑experimental
什么,什么是provisional
?我看到只有少数包被声明为stable
.它涉及什么样的稳定性,暴露的API的稳定性或软件的最终无错状态?
我在Hackage上维护了一个带有FFI绑定的库.所以我的Haskell库依赖于相应的C库及其头文件.现在我在.cabal
文件中指定外部依赖项,如下所示:
PkgConfig-Depends:
libfoo >= 1.2
Run Code Online (Sandbox Code Playgroud)
它在Linux中对我很有用.但是,我有一个库的用户报告,pkg-config
在Windows 上安装相当麻烦,而他更喜欢
Includes:
foo.h
Extra-libraries:
foo
Run Code Online (Sandbox Code Playgroud)
我希望我的库尽可能容易构建,并且不希望强制不严格要求的构建依赖项.但是,我看到Cabal手册建议使用PkgConfig-Depends
.
我的问题:
.cabal
这样的方式编写文件,它可以使用pkg-config
和不使用?pkg-config
包含在Haskell平台中(我现在没有Windows机器可以检查)?我想创建一个多语言网站,以便所有或几乎所有页面都可以使用2个或更多翻译版本.要遵循哪些最佳做法?
例如,我考虑这些语言选择机制:
Accept-Language
如果未设置cookie,则基于标头.还有别的事吗?
如何提供不同的翻译?
LANG.example.com/page
example.com/LANG/page
example.com/page?hl=LANG
example.com/page
?(似乎气馁)如何确保所有翻译都正确编入索引?
Content-Language
标题的站点地图都足够了?让用户知道有其他翻译的最佳方式是什么,但不要分散他们的注意力?
处理遗失/过时翻译的最佳政策是什么?
还有什么我应该考虑的?我该怎么做,我绝对不应该做什么?
让我们考虑一个包含许多构造函数的数据类型:
data T = Alpha Int | Beta Int | Gamma Int Int | Delta Int
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数来检查是否使用相同的构造函数生成了两个值:
sameK (Alpha _) (Alpha _) = True
sameK (Beta _) (Beta _) = True
sameK (Gamma _ _) (Gamma _ _) = True
sameK _ _ = False
Run Code Online (Sandbox Code Playgroud)
维护sameK
不是很有趣,无法轻易检查其正确性.例如,当添加新的构造函数时T
,很容易忘记更新sameK
.我省略了一行来举个例子:
-- it’s easy to forget:
-- sameK (Delta _) (Delta _) = True
Run Code Online (Sandbox Code Playgroud)
问题是如何避免样板sameK
?或者如何确保检查所有T
构造函数?
我找到的解决方法是为每个构造函数使用单独的数据类型,派生Data.Typeable
和声明一个公共类型类,但我不喜欢这个解决方案,因为它的可读性要低得多,否则只是一个简单的代数类型对我有用:
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable
class …
Run Code Online (Sandbox Code Playgroud) 我曾经问一个类似的问题一次.现在我会更具体.目的是学习一个Haskell习语来编写具有monadic结果的迭代算法.特别是,这可能对实现各种随机算法很有用,例如遗传算法等.
我写了一个示例程序,用Haskell中的这些算法表明了我的问题.它的完整来源是hpaste.
关键点是随机更新一个元素(因此结果是State StdGen
或者其他一些monad):
type RMonad = State StdGen
-- An example of random iteration step: one-dimensional random walk.
randStep :: (Num a) => a -> RMonad a
randStep x = do
rnd <- get
let (goRight,rnd') = random rnd :: (Bool, StdGen)
put rnd'
if goRight
then return (x+1)
else return (x-1)
Run Code Online (Sandbox Code Playgroud)
然后需要更新许多元素,并多次重复该过程.这是一个问题.由于每一步都是monad action(:: a -> m a
),重复多次,因此有效地组合这些动作很重要(快速忘记上一步).从我之前的问题中学到的东西(用折叠构成monad动作), seq
并deepseq
帮助组成monadic动作.所以我这样做:
-- Strict (?) iteration.
iterateM' …
Run Code Online (Sandbox Code Playgroud) 我有一个Hackage包依赖于第三方包,它不是建立在较新版本的GHC(> = 7.2)上.只需一行补丁(LANGUAGE
pragma)即可解决其他软件包的问题.我将补丁发送到上游两次,但没有收到任何反馈.问题是我的包不能安装,直到依赖项得到修复.
我本来可以上传固定版本的depenency软件包(带有一个小版本),但我想听听社区对这种非维护者上传的态度.同样,我不想更改库接口,我只添加一个新的编译标志,使其可以再次构建.
我试图用leptonica处理以下图像,用tesseract提取文本.
原始图片:
Tesseract在原始图像上得出:
i s l
D2J1FiiE-l191x1iitmwii9 uhiaiislz-2 Q ~37
Bottom linez
With a little time!
you can learn social media technology
using free online resources-
And if you donity
youlll be at a significant disadvantage
to
other HOn-pFOiiTS-
Run Code Online (Sandbox Code Playgroud)
不是很好,特别是顶级背景.所以使用leptionica我使用背景去除算法(模糊,差异,阈值,反转)来获得以下图像:
但是tesseract并没有做得很好:
@@r-mair lkrm@W lh@w ilr@ mJs@ iklh@ ii@c2lhm1@ll
mm Mime
VWU1 a Mitt-Jle time-
@1m ll@@Wn Om @@@lh1
using free onhne resources-
Andifyoudoni
9110 ate a $0 D
to other non-profrts
I
Run Code Online (Sandbox Code Playgroud)
看来,主要的问题是,现在所有的文本都是概述而不是实体.如何调整我的算法或我可以添加什么使文本变为实体?
我想在pdfLaTeX中找到一种方法来生成滴帽(大的初始字母高几行).我知道有一个dropping
包与latex
+一起使用时效果很好dvips
.但是,与pdflatex
结果一起使用时看起来很难看.
我的源文件是:
\documentclass[12pt]{article}
% for pdflatex file.tex # dropping is ugly
% \usepackage[pdftex]{graphicx}
% \usepackage[pdftex]{dropping}
% for latex file.tex ; dvips -T 12cm,8cm file.dvi # dropping is OK
\usepackage[dvips]{graphicx}
\usepackage{dropping}
\usepackage[papersize={12cm,8cm},
left=0.5cm,right=0.5cm,
top=0.5cm,bottom=0.5cm]{geometry}
\begin{document}
\dropping[-3pt]{3}{W}ith a drop cap, the initial sits within the margins and
runs several lines deep into the paragraph, pushing some normal-sized text off
these lines. This keeps the left and top margins of the paragraph flush.
In~modern browsers, …
Run Code Online (Sandbox Code Playgroud) 是否可以在包含多行字符串文字的Haskell代码上使用CPP扩展?Haskell还有其他条件编译技术吗?
例如,我们来看看这段代码:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Run Code Online (Sandbox Code Playgroud)
如果我取消注释{-# LANGUAGE CPP #-}
,那么GHC会用一个词法错误来反驳这段代码:
[1 of 1] Compiling Main ( cpp-multiline.hs, cpp-multiline.o )
cpp-multiline.hs:4:17:
lexical error in string/character literal at character 'o'
Run Code Online (Sandbox Code Playgroud)
使用GHC 6.12.1,可以使用cpphs.
我确认使用cpphs.compat包装器和-pgmP cpphs.compat
选项有帮助,但我希望有一个不依赖于自定义shell脚本的解决方案.-pgmP cpphs
不起作用.
PS我需要为GHC <6.12和GHC> = 6.12使用不同的代码,是否可以不使用预处理器?
UPD.除了接受Ganesh的答案之外,我还发现另一个解决方法是将所有条件声明放在一个单独的模块中{-# LANGUAGE CPP #-}
,从而避免使用多行字符串的模块中的CPP.
我试图弄清楚是否有可能(以及如何)为多参数类型同义词定义类实例.
例如:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
type F a b = a -> b
data DF a b = DF (a -> b)
class C c a b where
doc :: c a b -> a -> b
Run Code Online (Sandbox Code Playgroud)
它适用于多参数类型的实例:
instance C DF a b where
doc (DF f) x = f x
Run Code Online (Sandbox Code Playgroud)
但它不适用于类型同义词:
-- ERROR:
--
-- Type synonym `F' should have 2 arguments, but has been given none
-- In the instance declaration for `C F a b' …
Run Code Online (Sandbox Code Playgroud) haskell ×7
cabal ×2
hackage ×2
ghc ×1
latex ×1
ocr ×1
packaging ×1
pdf ×1
performance ×1
pkg-config ×1
preprocessor ×1
profiling ×1
random ×1
tesseract ×1
typeclass ×1
types ×1
typography ×1
windows ×1