这篇博文有一个有趣的解释,说明如何使用Omega monad对角枚举任意语法.他提供了一个如何操作的示例,从而产生无限的字符串序列.我想做同样的事情,除了生成一个实际数据类型列表,而不是生成字符串列表.例如,
data T = A | B T | C T T
Run Code Online (Sandbox Code Playgroud)
会生成
A, B A, C A A, C (B A) A...
Run Code Online (Sandbox Code Playgroud)
或类似的东西.不幸的是,我的Haskell技能仍在成熟,经过几个小时的演奏后,我无法做到我想要的.怎么办?
根据要求,我的一次尝试(我尝试了太多东西......):
import Control.Monad.Omega
data T = A | B T | C T T deriving (Show)
a = [A]
++ (do { x <- each a; return (B x) })
++ (do { x <- each a; y <- each a; return (C x y) })
main = print $ take 10 $ a
Run Code Online (Sandbox Code Playgroud) 在关于inline函数声明中的关键字的许多争论中,有人会指出它在某些情况下实际上会使程序变慢 - 主要是由于代码爆炸,如果我是正确的.我自己从未在实践中遇到过这样的例子.什么是实际代码,使用inline可能会对性能有害?
1990年,John Lamping发表了一篇论文,提出了无类型lambda演算的最佳实现.由于那篇论文已有25年历史,我想知道自那以后我们有多少进步.因此,我的问题是:什么是John的最优lambda演算评估算法的简单描述(或者,如果我们自改进算法以来进行了改进),最好简单解释一下Haskellish-pseudocode?
更新:因为自从我问过以后我学到了更多,我相信一个有效的答案可能只是一个非浮动算法的伪代码,它将纯粹的无类型lambda术语映射到交互网络; 2.减少那些网络和3.从网络映射到lambda术语,例如整个过程最佳地规范化初始lambda项.
language-agnostic haskell functional-programming lambda-calculus
通过查看代码而不是阅读冗长的解释,我更喜欢学习.这可能是我不喜欢长篇学术论文的原因之一.代码是明确的,紧凑的,无噪音的,如果你没有得到的东西,你可以玩它 - 不需要问作者.
这是Lambda微积分的完整定义:
-- A Lambda Calculus term is a function, an application or a variable.
data Term = Lam Term | App Term Term | Var Int deriving (Show,Eq,Ord)
-- Reduces lambda term to its normal form.
reduce :: Term -> Term
reduce (Var index) = Var index
reduce (Lam body) = Lam (reduce body)
reduce (App left right) = case reduce left of
Lam body -> reduce (substitute (reduce right) body)
otherwise -> App (reduce left) (reduce …Run Code Online (Sandbox Code Playgroud) lambda haskell functional-programming lambda-calculus lazy-evaluation
图像和像素渲染是Haskell最后的事情之一我无法选择一个足够有效的纯功能数据结构.为简单起见,我们来谈谈1D图像,因为它们可以很容易地扩展到nd图像.我正在使用未装箱的矢量作为表示,并使用它们的可变视图进行渲染:
-- An 1D image is an unboxed vector of Pixels
type Position = Int
data Image = Image { size :: Position, buffer :: UV.Vector Pixel }
-- A sprite is a recipe to draw something to an Image
newtype Sprite = Sprite (forall s .
-> (Position -> Pixel -> ST s ()) -- setPixel
-> ST s ()) -- ST action that renders to Image
-- Things that can be rendered to screen provide a …Run Code Online (Sandbox Code Playgroud) 我正在寻找Haskell 上MergeSort的规范实现以移植到HOVM,我找到了这个StackOverflow 答案。在移植算法时,我意识到有些事情看起来很愚蠢:该算法有一个“减半”函数,除了在递归和合并之前使用一半的长度将列表一分为二之外什么也不做。所以我想:为什么不更好地利用这个传球,并使用一个枢轴,使每一半分别比该枢轴小和大呢?这会增加递归合并调用应用于已排序列表的可能性,这可能会加快算法速度!
我已经完成了此更改,生成以下代码:
import Data.List
import Data.Word
randomList :: Word32 -> Word32 -> [Word32]
randomList seed 0 = []
randomList seed size = seed : randomList (seed * 1664525 + 1013904223) (size - 1)
quacksort :: [Word32] -> [Word32]
quacksort [] = []
quacksort [x] = [x]
quacksort (p : x : xs) = split p (p : x : xs) [] [] where
-- Splits the list in two halves of elements …Run Code Online (Sandbox Code Playgroud) 从这篇Haskell Cafe 帖子中,并借用jyp的一些代码示例,我们可以在 Haskell 中构造一个简单的 PHOAS 求值器,如下所示:
\n{-# LANGUAGE GADTs #-}\n{-# LANGUAGE RankNTypes #-}\n\nimport Data.Char\n\ndata Term v t where\n Var :: v t -> Term v t\n App :: Term v (a -> b) -> Term v a -> Term v b\n Lam :: (v a -> Term v b) -> Term v (a -> b)\n\ndata Exp t = Exp (forall v. Term v t)\n\n-- An evaluator\neval :: Exp t -> t\neval (Exp e) = …Run Code Online (Sandbox Code Playgroud) 没什么可补充的; 在qtScript上JavaScript的setTimeout相当于什么?
ImageMagick正在使用大量内存来转换PDF文件 - 超过2GB.我正在使用的命令是:
convert -density 250 -resize 1280x myfile.pdf -interlace plane -strip -quality 40 -alpha flatten myfolder/myfile-%03d.jpg
Run Code Online (Sandbox Code Playgroud)
如何改进?我有1GB的限制,否则这个过程会被无情地杀死.):
我是GitHub的新手.有人提交了5次提交的拉取请求.但是其中3个有一点虫子,所以必须等待.如何为我的项目挑选其中的2个?
haskell ×6
algorithm ×2
c ×1
commit ×1
converter ×1
github ×1
grammar ×1
imagemagick ×1
javascript ×1
lambda ×1
memory ×1
mergesort ×1
monads ×1
optimization ×1
performance ×1
pull-request ×1
qtscript ×1
quicksort ×1
resources ×1
settimeout ×1
sorting ×1
timer ×1