Bug 24797 - F# comparison fails with a list of tuples
Summary: F# comparison fails with a list of tuples
Status: RESOLVED FIXED
Alias: None
Product: iOS
Classification: Xamarin
Component: XI runtime ()
Version: XI 8.4.0
Hardware: Macintosh Mac OS
: Normal normal
Target Milestone: Untriaged
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2014-11-25 09:02 UTC by Dave Thomas
Modified: 2014-12-02 08:49 UTC (History)
6 users (show)

Tags:
Is this bug a regression?: ---
Last known good build:


Attachments
Sample project that demonstrates the error. (4.68 KB, application/zip)
2014-11-25 09:02 UTC, Dave Thomas
Details


Notice (2018-05-24): bugzilla.xamarin.com is now in read-only mode.

Please join us on Visual Studio Developer Community and in the Xamarin and Mono organizations on GitHub to continue tracking issues. Bugzilla will remain available for reference in read-only mode. We will continue to work on open Bugzilla bugs, copy them to the new locations as needed for follow-up, and add the new items under Related Links.

Our sincere thanks to everyone who has contributed on this bug tracker over the years. Thanks also for your understanding as we make these adjustments and improvements for the future.


Please create a new report on Developer Community or GitHub with your current version information, steps to reproduce, and relevant error messages or log files if you are hitting an issue that looks similar to this resolved bug and you do not yet see a matching new report.

Related Links:
Status:
RESOLVED FIXED

Description Dave Thomas 2014-11-25 09:02:19 UTC
Created attachment 8863 [details]
Sample project that demonstrates the error.

Essentially the following code:

let testCase = 
   let initialList =
      [ ([|"a"|], "b"), 3
        ([|"c"|], "d"), 4 ]
   Map.ofList initialList

This fails with: 

At least one argument has to implement IComparable interface

Essentially this is a list of Tuple<Tuple<[string], string>, int>

This is used internally in the F# compiler to produce assembly redirect so this blocks me from getting Xamarin Sketches working in the iOS simulator.

I have attached a simple iOS project that replicates this error.
Comment 1 Dave Thomas 2014-11-25 09:04:53 UTC
Heres the full stack trace:

System.ArgumentException: At least one argument has to implement IComparable interface
  at System.Collections.Generic.Comparer`1+DefaultComparer[System.Object].Compare (System.Object x, System.Object y) [0x0006a] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Collections.Generic/Comparer.cs:94
  at System.Collections.Generic.Comparer`1[System.Object].System.Collections.IComparer.Compare (System.Object x, System.Object y) [0x0003b] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Collections.Generic/Comparer.cs:70
  at System.Tuple`2[System.String[],System.String].System.Collections.IStructuralComparable.CompareTo (System.Object other, IComparer comparer) [0x00020] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Tuples.cs:161
  at System.Tuple`2[System.String[],System.String].System.IComparable.CompareTo (System.Object obj) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Tuples.cs:150
  at Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericCompare$cont@985-1 (Microsoft.FSharp.Core.GenericComparer comp, System.Object yobj, System.Object xobj, IComparable x, Microsoft.FSharp.Core.Unit unitVar) [0x000c3] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/prim-types.fs:993
  at Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericCompare (Microsoft.FSharp.Core.GenericComparer comp, System.Object xobj, System.Object yobj) [0x0007f] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/prim-types.fs:985
  at Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericComparisonWithComparerIntrinsic[Tuple`2] (IComparer comp, System.Tuple`2 x, System.Tuple`2 y) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/prim-types.fs:1195
  at Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericComparisonIntrinsic[Tuple`2] (System.Tuple`2 x, System.Tuple`2 y) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/prim-types.fs:1230
  at Microsoft.FSharp.Core.LanguagePrimitives+-cctor@2193-1[System.Tuple`2[System.String[],System.String]].System-Collections-Generic-IComparer`1-Compare (System.Tuple`2 x, System.Tuple`2 y) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/prim-types.fs:2193
  at Microsoft.FSharp.Collections.MapTreeModule.add[Tuple`2,Int32] (IComparer`1 comparer, System.Tuple`2 k, Int32 v, Microsoft.FSharp.Collections.MapTree`2 m) [0x0002c] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/map.fs:124
  at Microsoft.FSharp.Collections.MapTreeModule+ofList@320[System.Tuple`2[System.String[],System.String],System.Int32].Invoke (Microsoft.FSharp.Collections.MapTree`2 acc, System.Tuple`2 tupledArg) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/map.fs:320
  at Microsoft.FSharp.Collections.ListModule.loop@142-20[Tuple`2,MapTree`2] (Microsoft.FSharp.Core.FSharpFunc`3 f, Microsoft.FSharp.Collections.MapTree`2 s, Microsoft.FSharp.Collections.FSharpList`1 xs) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/list.fs:145
  at Microsoft.FSharp.Collections.ListModule.Fold[Tuple`2,MapTree`2] (Microsoft.FSharp.Core.FSharpFunc`2 folder, Microsoft.FSharp.Collections.MapTree`2 state, Microsoft.FSharp.Collections.FSharpList`1 list) [0x00012] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/list.fs:142
  at Microsoft.FSharp.Collections.MapTreeModule.ofList[Tuple`2,Int32] (IComparer`1 comparer, Microsoft.FSharp.Collections.FSharpList`1 l) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/map.fs:320
  at Microsoft.FSharp.Collections.FSharpMap`2[System.Tuple`2[System.String[],System.String],System.Int32].ofList (Microsoft.FSharp.Collections.FSharpList`1 l) [0x00007] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/map.fs:550
  at Microsoft.FSharp.Collections.MapModule.OfList[Tuple`2,Int32] (Microsoft.FSharp.Collections.FSharpList`1 elements) [0x00000] in /Developer/MonoTouch/Source/monotouch/external/fsharp/src/fsharp/FSharp.Core/map.fs:722
  at genericcomparison.genericcomparisonViewController.ViewDidLoad () [0x0005c] in /Users/dave/Projects/genericcomparison/genericcomparison/genericcomparisonViewController.fs:24
  at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr)
  at MonoTouch.UIKit.UIViewController.get_View () [0x00030] in /Developer/MonoTouch/Source/monotouch/src/build/compat/UIKit/UIViewController.g.cs:2543
  at genericcomparison.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x0001c] in /Users/dave/Projects/genericcomparison/genericcomparison/AppDelegate.fs:17
  at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, IntPtr principal, IntPtr delegate) [0x00005] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:62
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:46
  at genericcomparison.Main.main (System.String[] args) [0x00000] in /Users/dave/Projects/genericcomparison/genericcomparison/AppDelegate.fs:27
Comment 2 Udham Singh 2014-11-25 10:47:07 UTC
I have checked this issue and getting the same exception mentioned in comment 1. To reproduce this issue I have run the sample app attached in comment 0 and got the issue.

Screencast : http://www.screencast.com/t/smVtMrg6UFr

Application Output : https://gist.github.com/Udham1/56b1755de6a8015d851e

Environment info :

F# Language Binding : 5.6.0

=== Xamarin Studio ===

Version 5.5.4 (build 15)
Installation UUID: ce927b2a-2c07-44c5-b186-09cfdafba6dc
Runtime:
	Mono 3.10.0 ((detached/92c4884)
	GTK+ 2.24.23 (Raleigh theme)

	Package version: 310000031

=== Apple Developer Tools ===

Xcode 6.1 (6602)
Build 6A1052c

=== Xamarin.iOS ===

Version: 8.4.0.43 (Enterprise Edition)
Hash: 840a925
Branch: 
Build date: 2014-11-16 21:03:22-0500

=== Build Information ===

Release ID: 505040015
Git revision: f93940a35458a18052f1a25e106e62ca970d9c40
Build date: 2014-11-19 15:32:41-05
Xamarin addins: dc23cbd91a3a0e1d326328e1229e86c942a49ec8

=== Operating System ===

Mac OS X 10.9.4
Darwin Xamarin76s-Mac-mini.local 13.3.0 Darwin Kernel Version 13.3.0
    Tue Jun  3 21:27:35 PDT 2014
    root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64
Comment 3 Aaron Bockover [MSFT] 2014-11-25 12:09:03 UTC
I can reproduce this in C# on both desktop Mono and iOS:

	var a = Tuple.Create (new [] { "one", "two" }, "hello");
	var b = Tuple.Create (new [] { "one", "two" }, "hello");
	Comparer<Tuple<string[], string>>.Default.Compare (a, b);

Produces the exception:

System.ArgumentException: At least one argument has to implement IComparable interface
  at System.Collections.Generic.Comparer`1+DefaultComparer[System.Object].Compare (System.Object x, System.Object y) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Comparer`1[System.Object].System.Collections.IComparer.Compare (System.Object x, System.Object y) [0x00000] in <filename unknown>:0 
  at System.Tuple`2[System.String[],System.String].System.Collections.IStructuralComparable.CompareTo (System.Object other, IComparer comparer) [0x00000] in <filename unknown>:0 
  at System.Tuple`2[System.String[],System.String].System.IComparable.CompareTo (System.Object obj) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Comparer`1+DefaultComparer[System.Tuple`2[System.String[],System.String]].Compare (System.Tuple`2 x, System.Tuple`2 y) [0x00000] in <filename unknown>:0
Comment 4 Aaron Bockover [MSFT] 2014-11-25 12:10:06 UTC
Standalone test case: http://git.io/VQ1Wbw

That being said, I'm not even sure how this is supposed to /not/ produce that exception? Where would these comparers be registered? Is F# supposed to register comparisons for this?
Comment 5 Sebastien Pouliot 2014-11-25 14:33:37 UTC
AFAICT the C# sample is correct and the failure is legit.

It seems like F# has something special for handling this case - and somehow that's not getting hit in XI, as it seems to work (at least it does not throw) on desktop Mono.

@Dave XI is building/shipping a specific revision of F#, but we do not customize it. IOW our (or at least my) expertise is pretty much limited to this file:

https://github.com/xamarin/monotouch/blob/master/fsharp/Makefile

Do you know if XA has a similar issue ? that might point to an XI specific vs mobile build difference.
Comment 6 Dave Thomas 2014-11-26 04:55:47 UTC
@sebastien I know there is a difference in FSharp.Core between desktop and mobile so it may well be an issue with something there.   Ill try and replicate in XA
Comment 7 Dave Thomas 2014-11-26 05:14:29 UTC
Same issue on XA:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.ArgumentException: At least one argument has to implement IComparable interface
[MonoDroid] at System.Collections.Generic.Comparer`1/DefaultComparer<object>.Compare (object,object) <0x00293>
[MonoDroid] at System.Collections.Generic.Comparer`1<object>.System.Collections.IComparer.Compare (object,object) <0x001af>
[MonoDroid] at System.Tuple`2<string[], string>.System.Collections.IStructuralComparable.CompareTo (object,System.Collections.IComparer) <0x000e9>
[MonoDroid] at System.Tuple`2<string[], string>.System.IComparable.CompareTo (object) <0x0005f>
[MonoDroid] at Microsoft.FSharp.Core.LanguagePrimitives/HashCompare.GenericCompare$cont@985-1 (Microsoft.FSharp.Core.LanguagePrimitives/HashCompare/GenericComparer,object,object,System.IComparable,Microsoft.FSharp.Core.Unit) [0x000c3] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/prim-types.fs:993
[MonoDroid] at Microsoft.FSharp.Core.LanguagePrimitives/HashCompare.GenericCompare (Microsoft.FSharp.Core.LanguagePrimitives/HashCompare/GenericComparer,object,object) [0x0007f] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/prim-types.fs:985
[MonoDroid] at Microsoft.FSharp.Core.LanguagePrimitives/HashCompare.GenericComparisonWithComparerIntrinsic<System.Tuple`2<string[], string>> (System.Collections.IComparer,System.Tuple`2<string[], string>,System.Tuple`2<string[], string>) <0x0003a>
[MonoDroid] at Microsoft.FSharp.Core.LanguagePrimitives/HashCompare.GenericComparisonIntrinsic<System.Tuple`2<string[], string>> (System.Tuple`2<string[], string>,System.Tuple`2<string[], string>) <0x000f3>
[MonoDroid] at Microsoft.FSharp.Core.LanguagePrimitives/-cctor@2193-1<System.Tuple`2<string[], string>>.System-Collections-Generic-IComparer`1-Compare (System.Tuple`2<string[], string>,System.Tuple`2<string[], string>) <0x00047>
[MonoDroid] at Microsoft.FSharp.Collections.MapTreeModule.add<System.Tuple`2<string[], string>, int> (System.Collections.Generic.IComparer`1<System.Tuple`2<string[], string>>,System.Tuple`2<string[], string>,int,Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>) [0x0002c] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/map.fs:124
[MonoDroid] at Microsoft.FSharp.Collections.MapTreeModule/ofList@320<System.Tuple`2<string[], string>, int>.Invoke (Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>,System.Tuple`2<System.Tuple`2<string[], string>, int>) [0x00000] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/map.fs:320
[MonoDroid] at Microsoft.FSharp.Collections.ListModule.loop@142-20<System.Tuple`2<System.Tuple`2<string[], string>, int>, Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>> (Microsoft.FSharp.Core.OptimizedClosures/FSharpFunc`3<Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>, System.Tuple`2<System.Tuple`2<string[], string>, int>, Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>>,Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>,Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Tuple`2<string[], string>, int>>) <0x00070>
[MonoDroid] at Microsoft.FSharp.Collections.ListModule.Fold<System.Tuple`2<System.Tuple`2<string[], string>, int>, Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>> (Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>, Microsoft.FSharp.Core.FSharpFunc`2<System.Tuple`2<System.Tuple`2<string[], string>, int>, Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>>>,Microsoft.FSharp.Collections.MapTree`2<System.Tuple`2<string[], string>, int>,Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Tuple`2<string[], string>, int>>) <0x000af>
[MonoDroid] at Microsoft.FSharp.Collections.MapTreeModule.ofList<System.Tuple`2<string[], string>, int> (System.Collections.Generic.IComparer`1<System.Tuple`2<string[], string>>,Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Tuple`2<string[], string>, int>>) [0x00000] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/map.fs:320
[MonoDroid] at Microsoft.FSharp.Collections.FSharpMap`2<System.Tuple`2<string[], string>, int>.ofList (Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Tuple`2<string[], string>, int>>) [0x00007] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/map.fs:550
[MonoDroid] at Microsoft.FSharp.Collections.MapModule.OfList<System.Tuple`2<string[], string>, int> (Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Tuple`2<string[], string>, int>>) [0x00000] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/fsharp/src/fsharp/FSharp.Core/map.fs:722
[MonoDroid] at android_comparer.MainActivity.OnCreate (Android.OS.Bundle) [0x0012a] in /Users/dave/Projects/genericcomparison/android_comparer/MainActivity.fs:30
[MonoDroid] at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.App.Activity.cs:2661
[MonoDroid] at (wrapper dynamic-method) object.184076fc-1722-41dc-98fe-bf28126e3bc9 (intptr,intptr,intptr) <IL 0x00017, 0x00027>
[AndroidRuntime] Shutting down VM
[mono] Unable to find seq points for method '(wrapper managed-to-native) System.Diagnostics.Debugger:Mono_UnhandledException_internal (System.Exception)'.
[] * Assertion at /Users/builder/data/lanes/monodroid-mavericks-master/af4cb1e9/source/mono/mono/mini/debugger-agent.c:5454, condition `sp' not met
[libc] Fatal signal 6 (SIGABRT) at 0x0000053b (code=-6), thread 1358 (ndroid_comparer)
Step request failed: Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown.
Comment 8 Sebastien Pouliot 2014-11-26 14:12:57 UTC
Thanks for testing. Since XA fails it's definitively a mobile-related issue (but not XI specific).

I don't recall who did the mobile/2.1 port... @Miguel do you know ?
Comment 9 donsyme 2014-11-27 07:01:51 UTC
Is the mscorlib.dll or C# source code for "System.Tuple<T1,T2>..System.Collections.IStructuralComparable.CompareTo" that is running on the mobile device available?

For some reason, the default comparer object is being used instead of the "comparer" object being passed in (or the "comparer" object is incorrectly the default one).  The comparer object should be one provided by FSharp.Core.dll that correctly compares arrays structurally.

Thanks
Don
Comment 10 donsyme 2014-11-27 07:11:44 UTC
It looks like the build of FSharp.Core.dll for monodroid and monotouch set FX_NO_STRUCTURAL_EQUALITY.  https://github.com/fsharp/fsharp/blob/master/src/FSharpSource.targets#L144 and https://github.com/fsharp/fsharp/blob/master/src/FSharpSource.targets#L160

This define should only be set if System.Collections.IStructuralEquatable/IStructuralComparable are _not_ defined in the target platform.

This looks incorrect  - looking at "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoTouch\v1.
0\mscorlib.dll" these types appear to be  available in the target platforms now.

I believe this _might_ be sufficient to cause the problems you're seeing but I'm not totally sure.  

The other #defines also need to be reviewed.

Dave - if you need to workaround this then I believe changing the use of (string[] * string) as a key to (string list * string) would be sufficient (i.e. any key type not involving arrays).
Comment 11 donsyme 2014-11-27 07:15:09 UTC
Note that correcting the FX_NO_STRUCTURAL_EQUALITY would mean 

(a) republishing whichever component includes those builds of FSharp.Core for those mobile platforms

(b) republishing the nuget package that includes those DLLs (I think Xamarin rely on those).

(c) updating any templates using that nuget package to use the updated version
Comment 12 Dave Thomas 2014-11-27 07:34:18 UTC
Hi Don, if the code was my own then I could adjust the collection key as you mentioned, unfortunately the collection is defined in the compiler as part of generating the assembly redirects. 

I will try removing FX_NO_STRUCTURAL_EQUALITY to see if this helps.
Comment 13 donsyme 2014-11-27 08:20:19 UTC
Hi Dave, 

If necessary add a patch to FSharp.Compiler.Service to workaround this problem (changing the key type of the collection in the compiler service).  Perhaps define a new key type

type Key = Key of string[] * string

and define explicit hash/compare.

Cheers!
Don
Comment 14 Dave Thomas 2014-11-27 11:24:13 UTC
Removing FX_NO_STRUCTURAL_EQUALITY allows the sample posted here to run on iOS

Ill confirm this also fixes the issue in FCS for my use case with Sketches, and submit patches as appropriate.
Comment 15 Sebastien Pouliot 2014-12-02 08:43:18 UTC
monotouch/master 2511a879683b7d8ec7e74cf5807e111c4e773c85 bumped F# to 3.1.1.10

if this works fine (or at least build) this will be applied to monotouch-8.6.0-branch
Comment 16 donsyme 2014-12-02 08:46:27 UTC
Just to check - you say "bumped to 3.1.1.10", but I expect that to be "3.1.1.30"?
Comment 17 Sebastien Pouliot 2014-12-02 08:49:11 UTC
yup, fat fingers + limited caffeine levels :)

The commitbeing used is: efb1abf23c5cc7b1588c5facc215e0aa6c421850


commit 2511a879683b7d8ec7e74cf5807e111c4e773c85
Author: Sebastien Pouliot <sebastien@xamarin.com>
Date:   Tue Dec 2 08:41:20 2014 -0500

    Bump fsharp to 3.1.1.30 [#24797]

diff --git a/external/fsharp b/external/fsharp
index 128f3bc..efb1abf 160000
--- a/external/fsharp
+++ b/external/fsharp
@@ -1 +1 @@
-Subproject commit 128f3bc8daf02fcd44724d7999252a1c8cc0e73c
+Subproject commit efb1abf23c5cc7b1588c5facc215e0aa6c421850
pollux:external sebastienpouliot$ cd fsharp/
pollux:fsharp sebastienpouliot$ git show
commit efb1abf23c5cc7b1588c5facc215e0aa6c421850
Author: F# Core Engineering Group (Git Repo Management) <fsgit@fsharp.org>
Date:   Mon Dec 1 23:12:57 2014 +0000

    move DLLs to MonoAndroid