小编bar*_*oap的帖子

颧弓形态前同态的真实应用

是的,这些:

{-#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上发布了一个简短的解释.

符合条件的答案必须:

  1. 至少做一些远程的,理论上计算上有用的东西.也就是说,减少的答案id已经消失.

  2. 使用该方案的所有功能,不传入id,const或等效.

  3. 不能用简单的香草褶皱等表达,所以不要仅仅product以蜿蜒的方式实施.

奖励积分将给予:

  • 众所周知的问题或算法

  • 解决,分别表达,以一种不寻常的方式获得

  • 清晰度和/或性能

  • 和/或黑客价值

  • 和/或lulz,大致按此顺序,以及

  • 高级答案(耶和华民主)

请注意爱德华的答案如下.您使用的ZHPM实施是您的选择.

haskell functional-programming category-theory

155
推荐指数
2
解决办法
1万
查看次数

如何判断Haskell是缓存结果还是重新计算结果?

我注意到有时Haskell纯函数以某种方式被缓存:如果我用相同的参数调用函数两次,第二次立即计算结果.

  1. 为什么会这样?它是GHCI功能还是什么?
  2. 我能依靠这个(即:我能确定地知道是否会缓存一个函数值)?
  3. 我可以为某些函数调用强制或禁用此功能吗?

根据评论的要求,这是我在网上找到的一个例子:

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不会花费时间).

caching haskell function

33
推荐指数
1
解决办法
2362
查看次数

有没有更深层次的理论理由GHC无法推断出这种类型?

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)

haskell type-inference

5
推荐指数
1
解决办法
549
查看次数