2010-11-30 14 views
6

tip birimine sahip olmalıdır. Ocaml içinde "for" için döngüler içeren bir program yazıyordum, benim sorunum şu döngülerden her biri için bu mesajı alıyorsunuz: "warning 10: this expression type olmalı birimi. "warning 10: Bu ifade,

Örnek:

let f q p rho= 

     let x = [] in 
     if q > p then 
      for i=0 to rho do 
       x= q :: x 
      done;  
    x;; 

bu bir döngü kullanmak her zaman '' için, nasıl bu sorunu çözebilir?

cevap

8

Kodunuzla ilgili birçok sorun var.

Hata, for'un hiçbir şey döndürmemesi ve bu nedenle döngünün iç kısmının tamamen yan etkide olması nedeniyle oluşur. Yani birim tip olmalı. = kullanımınız, birim türüne sahip değildir, çünkü = aslında eşitlik operatörüdür, iki değeri karşılaştırır ve true veya false döndürür.

Yanlış işleci kullanıyorsunuz. x'a "atama" yapmaya çalıştığınız anlaşılıyor. Fakat ML'de, "değişkenlere" atayamazsınız, çünkü tanımlandıkları ve değişmeyecekleri bir değere bağlılar. Mutabilite elde etmenin bir yolu, değiştirilebilen bir hücre kullanmaktır ("referans" olarak adlandırılır): ref işlevini, bir ilk değerden değiştirilebilen hücre oluşturmak için kullanırsınız; değerini almak için ! operatörünü; ve içteki değeri değiştirmek için := operatörüne. Örneğin bu şekilde

:

let f q p rho= 

    let x = ref [] in 
    if q > p then 
     for i=0 to rho do 
      x := q :: !x 
     done;  
    !x;; 
+0

sayesinde sizin Cevap ver, örneğini "!" : x: = q ::! x – kafka

+0

@Antonio: teşekkürler – newacct

3

döngü Bu tür muhtemelen en iyi özyineleme kullanarak ifade edilir:

let f q p rho= 
    let rec loop i = 
    if i > rho then 
     [] 
    else 
     q::(loop (i+1)) 
    in 
    if q > p then 
     loop 0 
    else 
     [];; 

Ya biz kuyruk özyinelemeli yapabilirsiniz: için

let f q p rho= 
    let rec loop i acc = 
    if i > rho then 
     acc 
    else 
     loop (i+1) (q::acc) 
    in 
    if q > p then 
     loop 0 [] 
    else 
     [];; 
İlgili konular