标签: lazy-evaluation

haskell中pascal三角形的变体 - 懒惰评估的问题

为了解决一些问题,我需要计算pascal三角形的变体,其定义如下:

f(1,1) = 1, 
f(n,k) = f(n-1,k-1) + f(n-1,k) + 1 for 1 <= k < n, 
f(n,0) = 0,
f(n,n) = 2*f(n-1,n-1) + 1.
Run Code Online (Sandbox Code Playgroud)

对于给定的n,我想有效地得到第n行(f(n,1)... f(n,n)).另一个限制:f(n,k)如果> = 2 ^ 32则应为-1.

我的实施:

next :: [Int64] -> [Int64]
next list@(x:_) = x+1 : takeWhile (/= -1) (nextRec list)

nextRec (a:rest@(b:_)) = boundAdd a b : nextRec rest
nextRec [a] = [boundAdd a a]

boundAdd x y
    | x < 0 || y < 0 = -1
    | x + y + …
Run Code Online (Sandbox Code Playgroud)

algorithm haskell lazy-evaluation pascals-triangle

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

MEF Lazy ImportMany with Creationpolicy.NonShared

我是mef的初学者,所以我有一个问题:)我有以下内容:

[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(SharedExport))]
public class SharedExport : INPCBase
{
    [ImportMany(typeof(INonShared),RequiredCreationPolicy = CreationPolicy.NonShared)]
    private IEnumerable<Lazy<INonShared,Dictionary<string,object>>> fac;

    ...

    public void Open()
    {
        foreach (var lazy in fac)
        {
            this.Muster.Add(lazy.Value);
        }

    }
Run Code Online (Sandbox Code Playgroud)

导入的所有类都标记为非共享.

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(INonShared))]
[ExportMetadata("Muster","030")]
public sealed class NonShared1 : INPCBase, INonShared
{
    public NonShared1()
    {
        Debug.WriteLine("ctor NonShared1" + this.GetHashCode().ToString());
    }

    #region Implementation of INonShared

    public string Displayname
    {
        get { return "Muster 030 "+ this.GetHashCode().ToString(); 
        }
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题:当Open()执行时,是否应该始终创建一个新的NonShared1实例?我总是一样的.

c# mef lazy-evaluation

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

如何强制评价这个表达式?

module Main where

import Control.Parallel(par,pseq)
import Text.Printf
import Control.Exception
import System.CPUTime
import Data.List
import IO
import Data.Char
import Control.DeepSeq

time :: IO t -> IO t
time a = do
   start <- getCPUTime
   v <- a
   end <- getCPUTime
   let diff = (fromIntegral (end - start)) / (10^12)
   printf "Computation time: %0.3f sec\n" (diff :: Double)
   return v

learquivo :: FilePath -> IO ([[Int]])
learquivo s = do
   content <- readFile s
   return (read content)

main :: IO ()
main …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation

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

在Perl中,如何只拆分字符串的某个前导部分?

我正在解析一个长行的文件,其标记是以空格分隔的.在处理大部分行之前,我想检查第n个(小n)令牌是否有一些值.我会跳过大部分线路,所以真的没有必要拆分大部分非常长的线路.有没有快速的方法在Perl中进行懒惰分割,还是需要自己动手?

perl split lazy-evaluation

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

Haskell:由解析方法影响的懒惰

我有一个简单的程序(这是CCC 2012上的第二个问题),它取一个数字列表,并确定是否有任何严格增加/减少/不变的序列正在进行.例如:

1 2 3 4 7 8 => Increasing
5 1 -2 -100 => Decreasing
9 9 9 9 9 9 => Constant
1 2 3 4 5 0 => Nothing
Run Code Online (Sandbox Code Playgroud)

当我对此进行编码时,我对Haskell的智能程度感到震惊.出于某种原因,当我以交互方式输入数字到stdin时,在我完成之前就给了我答案!我认为这是一个错误,但后来我愚蠢地意识到,Haskell的懒惰(我想?)正在采取独自去决定,之后我进入1,2,3,0,不管以后有什么来了,结果将是Nothing,所以它高兴地输出那个.

不幸的是,当我改变时

let readings = map (read :: (Read a, Num a) => String -> a) $ lines input
Run Code Online (Sandbox Code Playgroud)

let readings = parse $ lines input
Run Code Online (Sandbox Code Playgroud)

parse被读取数字输入一个更安全的方法,实现为

maybeRead :: (Read a) => String …
Run Code Online (Sandbox Code Playgroud)

parsing haskell functional-programming input lazy-evaluation

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

懒惰评估实施

我有一个函数fromRange,它接受一个过滤函数和一个区间,并返回一个集合,其中包含满足过滤函数的区间中的所有元素.

我使用list comprehension实现它:

fromRange   :: (Integer->Bool) -> (Integer,Integer)  -> [Integer]
fromRange f (x,y) = [i | i<-[x..y], f i]
Run Code Online (Sandbox Code Playgroud)

但是大清单需要很长时间,所以我找到了懒惰的评估概念,但我不知道如何实现它,任何帮助?

haskell lazy-evaluation

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

Lazy Pascal在Clojure的三角形

我正在尝试在Clojure中编写一个简洁,懒惰的Pascal三角形,旋转使得行/列跟随三角形的对角线.也就是说,我想生成以下lazy-seq的lazy-seq:

((1 1 1 1 ...)
 (1 2 3 4 ...)
 (1 3 6 10 ...)
 ...
 )
Run Code Online (Sandbox Code Playgroud)

我写的代码是:

(def pascal
  (cons (repeat 1)
        (lazy-seq
          (map #(map + %1 %2)
               (map #(cons 0 %) (rest pascal)))
               pascal
          )))
Run Code Online (Sandbox Code Playgroud)

这样每一行都是通过将自身的右移版本添加到前一行来形成的.问题是它永远不会越过第一行,因为那时(map #(cons 0 %) (rest pascal)))是空的.

=> (take 5 (map #(take 5 %) pascal))
((1 1 1 1 1))
Run Code Online (Sandbox Code Playgroud)

什么是解决这个问题的合理方法?我对Clojure中的编程很新,并且考虑到它涉及的问题的方式非常不同,所以我非常感谢任何有这方面经验的人的建议.

clojure lazy-evaluation pascals-triangle

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

执行懒惰评估(OCaml)

我正在尝试执行懒惰的评估.


我创建了一个lazy list类型和相应的map功能.

type 'a zlist = 'a node_t lazy_t
and 'a node_t = Empty | Node of 'a * 'a zlist

let rec zlist_of_list l = lazy (
  match l with
    | [] -> Empty
    | hd::tl -> Printf.printf "transforming %d\n" hd;Node (hd, zlist_of_list tl)
)

let rec list_of_zlist zl = 
  match Lazy.force zl with
    | Empty -> []
    | Node (hd, tl) -> hd::(list_of_zlist tl)

let rec map_z f zl = lazy (
  match …
Run Code Online (Sandbox Code Playgroud)

ocaml functional-programming lazy-evaluation

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

为什么Haskell中的懒惰评价"不是懒惰"?

当我在cghi中尝试以下代码时:

take 1 $ take 1 $ repeat [1..]
Run Code Online (Sandbox Code Playgroud)

我期待结果1而不是[[1,2,3,4,5,6,7,8,9,10,...在我的终端上打印.

为什么懒惰的评价不起作用,因为我希望在这种情况下?

haskell lazy-evaluation

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

什么是严格?

在Haskell中,我试图理解严格的概念.我明白那个

const x y = x
Run Code Online (Sandbox Code Playgroud)

第一个参数是严格的,但第二个参数不是.但是

 ifFun pred cons alt = if pred then cons else alt
Run Code Online (Sandbox Code Playgroud)

严格?第一个论点是严格的.我理解cons和alt的评估取决于pred的值.这是否意味着函数对这些参数不严格?

haskell lazy-evaluation

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