Кажется, что работает следующее:
let wrapper<'a, 'b> (x:'a) =
match box x with
| null -> null
| :? array<array<'b>> as y -> y
| :? array<'b> as y -> [|y|]
| y -> [|[|unbox y|]|]
Подпись 'a -> array<array<'b>>
.
В ответ на ваш комментарий: подобные вещи могут быть выполнены в статически типизированных языках.и, возможно, лучше, чем в динамическом языке, но / потому что выход за пределы системы типов должен быть явным (например, box
/ unbox
).