是的,这些:
{-#LANGUAGE TypeOperators, RankNTypes #-}
import Control.Morphism.Zygo
import Control.Morphism.Prepro
import Control.Morphism.Histo
import Control.Functor.Algebra
import Control.Functor.Extras
import Control.Functor.Fix
import Control.Comonad.Cofree
zygohistomorphic_prepromorphism
:: Functor f
=> Algebra f b
-> GAlgebra f (ZygoT (Cofree f) b) a
-> (f :~> f)
-> FixF f
-> a
zygohistomorphic_prepromorphism f
= g_prepro (distZygoT (liftAlgebra f) (distHisto id))
Run Code Online (Sandbox Code Playgroud)
是的,我知道他们是(HHOS)的笑话.我正在寻找一个简单的黑客价值的真实世界的例子,最后,但并非最不重要的是,将它添加到维基说"这是表达XYZ的惯用方式".如果你没有提出解决方案,我会对此表示赏心悦目.如果你完全迷失了他们的意思,爱德华在reddit上发布了一个简短的解释.
符合条件的答案必须:
至少做一些远程的,理论上计算上有用的东西.也就是说,减少的答案id已经消失.
使用该方案的所有功能,不传入id,const或等效.
不能用简单的香草褶皱等表达,所以不要仅仅product以蜿蜒的方式实施.
奖励积分将给予:
众所周知的问题或算法
解决,分别表达,以一种不寻常的方式获得
清晰度和/或性能
和/或黑客价值
和/或lulz,大致按此顺序,以及
高级答案(耶和华民主)
请注意爱德华的答案如下.您使用的ZHPM实施是您的选择.
我注意到有时Haskell纯函数以某种方式被缓存:如果我用相同的参数调用函数两次,第二次立即计算结果.
根据评论的要求,这是我在网上找到的一个例子:
isPrime a = isPrimeHelper a primes
isPrimeHelper a (p:ps)
| p*p > a = True
| a `mod` p == 0 = False
| otherwise = isPrimeHelper a ps
primes = 2 : filter isPrime [3,5..]
Run Code Online (Sandbox Code Playgroud)
在运行它之前,我期望它非常慢,因为它一直在访问元素而primes没有显式地缓存它们(因此,除非这些值在某处缓存,否则它们需要重新计算很多次).但是我错了.
如果我设置+sGHCI(在每次评估后打印时间/内存统计数据)并评估表达式primes!!10000两次,这就是我得到的:
*Main> :set +s
*Main> primes!!10000
104743
(2.10 secs, 169800904 bytes)
*Main> primes!!10000
104743
(0.00 secs, 0 bytes)
Run Code Online (Sandbox Code Playgroud)
这意味着必须缓存至少primes !! 10000(或更好:整个primes列表,因为也primes!!9999不会花费时间).
GHC拒绝该计划
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Foo = Foo
data Bar = Bar
data (:::) :: * -> * -> * where
(:=) :: sy -> t -> sy ::: t
data Rec :: [*] -> * where
RNil :: Rec '[]
(:&) :: (sy ::: ty) -> Rec xs -> Rec ((sy ::: ty) ': xs)
infix 3 :=
infixr 2 :&
baz :: Num …Run Code Online (Sandbox Code Playgroud)