On 12/7/12 11:58 AM, Steve Jenson wrote:
Hi rust gurus,

Today I ported the purely functional Pairing Heap found in Okasaki's
Purely Functional Data Structures to Rust. I was hoping that some of you
might take a look at it and give me feedback on where I could be using
Rust's idioms better.

https://github.com/stevej/rustled/blob/master/pairing_heap.rs

The code I wrote is a little longer than Okasaki's example, mostly due
to Standard ML's more concise pattern matching. (see page 54 for
comparison) Is there a way to do pattern matching in argument lists as
in Haskell or SML?

Yes, in Rust 0.5 this works.

I noticed several things:

* Using explicit self (&self) will help make your levels of indirection consistent between `self` and `other` in a few functions. This works better in 0.5 than it does in 0.4.

* Braces aren't necessary after the => in patterns unless you want multiple statements.

* I'm confused as to why you need an @record as your type in PairingHeap_ (note that records are deprecated in favor of structs). In Rust 0.5 you can say

    pub enum PairingHeap<E:Copy Eq Ord> {
        Empty,
        PairingHeapCell {
            head: E,
            rest: @List<PairingHeap<E>>
        }
    }

* You can use "self" as the return value in a trait.

* In 0.5 you can use #[deriving_eq] for your enum to avoid writing the Eq definition, although I'm not sure that works for struct-like enum variants as in PairingHeapCell above (I should check this).

* @ signs are required for pattern matching because pattern matching never dereferences through pointers implicitly.

* You have a bunch of "return" expressions in which "return" can be left off.

* Some of your if statements could be replaced with pattern guards.

* is_empty() could just be:

   pure fn is_empty(&self) -> bool { *self == Empty_ }

Patrick
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to