F#ならUIAutomation出来た!!

#r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationClient.dll";;
#r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationTypes.dll";;

open System
open System.Windows.Automation

let gc (e:AutomationElement) check =
  let el = e.FindAll(TreeScope.Children, Condition.TrueCondition) in
  let el_arr = Array.init el.Count (fun i -> el.Item(i)) in
  el_arr |> Array.to_list |> List.find (fun el -> check el.Current)
;;

let el = gc (gc AutomationElement.RootElement (fun e -> e.ClassName = "SciCalc")) (fun e -> e.Name = "1") in
(el.GetCurrentPattern(InvokePattern.Pattern) :?> InvokePattern).Invoke()

これで電卓のボタンが押せました!! この14行(実質8行程度)を書くのに3時間以上費やした……。The F# Manualをみながら作業したんですが、配列から要素を取り出す方法と、ObjectからInvokePatternにダウンキャストするところが難関だった……。
アップキャストは":>"、ダウンキャストは":?>"で出来るって事なんだろうか?
ちなみに、

open System
open System.Threading
;;
let str = Thread.CurrentThread.GetApartmentState().ToString() in
printfn "%s" str

を実行すると、"MTA"となるので、IronRubyPowerShellでうまくいかなかったのは、アパートメントのせいではないようです。