Parametric polymorphism: Difference between revisions
Content added Content deleted
(Add Nimrod) |
|||
Line 732: | Line 732: | ||
(7 nodes) |
(7 nodes) |
||
</pre> |
</pre> |
||
=={{header|Rust}}== |
|||
<lang rust> |
|||
struct TreeNode<T> { |
|||
value: T, |
|||
left: Option<Box<TreeNode<T>>>, |
|||
right: Option<Box<TreeNode<T>>> |
|||
} |
|||
impl <T> TreeNode<T> { |
|||
fn my_map(&self, f: |t: &T| -> T) -> TreeNode<T> { |
|||
TreeNode { |
|||
value: f(&self.value), |
|||
left: match self.left {None => None, Some(ref n) => Some(box n.my_map(|n| f(n)))}, |
|||
right: match self.right {None => None, Some(ref n) => Some(box n.my_map(|n| f(n)))} |
|||
} |
|||
} |
|||
} |
|||
fn main() { |
|||
let root = TreeNode { |
|||
value: 3i, |
|||
left: Some(box TreeNode { |
|||
value: 55i, |
|||
left: None, |
|||
right: None |
|||
}), |
|||
right: Some(box TreeNode { |
|||
value: 234i, |
|||
left: Some(box TreeNode { |
|||
value: 0i, |
|||
left: None, |
|||
right: None |
|||
}), |
|||
right: None |
|||
}) |
|||
}; |
|||
root.my_map(|x| {println!("{}", x); *x}); |
|||
println!("---------------"); |
|||
let new_root = root.my_map(|x| x * 333); |
|||
new_root.my_map(|x| {println!("{}", x); *x}); |
|||
}</lang> |
|||
=={{header|Scala}}== |
=={{header|Scala}}== |