F # - في حين أن مشاكل نظرا لحالة الصفوف (tuple)

StackOverflow https://stackoverflow.com/questions/161348

  •  03-07-2019
  •  | 
  •  

سؤال

ونظرا لما يلي:

#light
//any function returning bool * 'a
let foo =
    let x = ref 10
    fun () ->
        x := !x - 1
        if !x <> 0 then
            (true, x)
        else
            (false, x)

while let (c,x) = foo() in c do print_any x;//can't access x, but would be convinent.

//this is how I want it to work, without all the typing
let rec loop f =
    match f() with
    | (true, x) ->
        print_any x
        loop f
    | (false, _) -> ()
loop foo

وكيف يجب أن تذهب نحو حل هذا؟ أو ينبغي أن مجرد الذهاب من خلال مشاحنات لتحويل "فو" لتعبير تسلسل؟

هل كانت مفيدة؟

المحلول

وهذا هو حل واحد، ولكن أنا شخصيا أعتقد أنه من سوء المعاملة من بناء بعض الوقت.

#light
while 
   (let (c,x) = foo()
    if c then print_any !x
    c)
   do ()

نصائح أخرى

وهناك حل آخر وهو أفضل قليلا في رأيي. فإنه يحصل العاشر خارج نطاق الشرط حالة في حين ووضعه في ذ إشارة الذي يتوفر في نطاق أعلى. لا يزال ليست أفضل (وظيفي) حل لكنه يعمل.

let y = ref 1
while (let (c,x) = foo()
       y := !x
       c)
       do printf "%i" !y

وأعتقد أن الحل rec loop الخاص بك يعمل بشكل أفضل نظرا لأنه هو الأكثر وظيفية (تجنب الآثار الجانبية، على الرغم من فو يستخدم الدولة) وأكثرها العام (أنه يعمل على جميع وظائف نفس الوقت فو). ومن الكتابة أطول، ولكن إذا كنت ستستخدم المزيد من الوظائف مثل فو، حلقة هي أكثر إنتاجية من واحد أقصر حل واحد فقط لفو.

وحتى أود أن التعميم حلقة بعض أكثر ومجردة بعيدا عمل ما تريد القيام به مع قيمة في الوضع "الحقيقي":

let loop f a = 
   let rec loop2() = 
      match f() with
      | (true, x) ->
         a x
         loop2()
      | (false, _) -> ()
   loop2()

loop foo print_any

وأنا أحب اقتراحات أخرى لكيفية تستهلك "فو" والذي عقد ثابتة على افتراض فو.

لأنفي، رمز ل "فو" رائحة. إذا كان من المعقول أن تحويل "فو" إلى "شريط" على غرار

let bar =    
    let x = ref 10    
    seq {
        x := !x - 1        
        while !x <> 0 do
            yield x
            x := !x - 1        
    }
bar |> Seq.iter print_any

وبعد ذلك أود أن تفعل ذلك، ولكن "بار"، في حين أن أفضل نوعا ما، ما زال يبدو مريب. (في "بار"، والحفاظ على الجانب الغريب أن تقوم بإرجاع "المرجع الباحث" بدلا من "كثافة" فقط، إذ أن "فو" فعلت ذلك، ولكن نأمل أن كان هذا الجانب غير مقصود؟)

وأعتقد أن الشيء الذي هو غير تقليدي جدا حول "فو" هو نوع من المعلومات الضمنية التي ليس واضحا من نوع البيانات (يمكنك الاحتفاظ يدعو هذا ما دام جزء منطقي صحيح)، وهو ما يجعل يليها نسخة قليلا أكثر جاذبية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top