用数组键入测试模式

时间:2014-01-27 16:06:56

标签: f# pattern-matching

我有一种情况,我被交给一个对象,需要生成一个字符串。在大多数情况下,我可以调用.ToString()并完成它(适用于字符串,数字,日期等)。

这种情况不起作用的一种情况是表示GUID的字节数组。在这种情况下,ToString()只会报告“System.Byte []”。我正在尝试使用模式匹配来捕获字节数组,以便我可以自定义字符串化。但我无法弄清楚如何匹配字节数组(或实际上,任何数组),除了通过数组模式。 GUID是16个字节长,我真的不希望有一个16个命名数组元素的模式。此外,使用数组模式会导致F#想要一个数组作为输入,而不是一个对象:

match value (* <-- obj *) with
| [|
    b1;  b2;  b3;  b4;
    b5;  b6;  b7;  b8;
    b9;  b10; b11; b12;
    b13; b14; b15; b16
  |] -> (* do some magic here later... *) b1.ToString()
| x -> x.ToString()
> This expression was expected to have type obj but here has type 'a []

我尝试使用Type测试模式,但是会导致编译错误(打开方括号似乎有问题):

match value (* <-- obj *) with
| :? byte[] as guid -> (* do some magic here later... *) guid.ToString()
| x -> x.ToString()
> Unexpected symbol '[' in pattern matching. Expected '->' or other token.

Pattern Matching上的F#文档似乎没有涵盖数组类型测试,我也没有通过Google找到适合我需求的任何内容。这里的语法是什么?

2 个答案:

答案 0 :(得分:6)

您可以使用:

match o with
| :? array<byte> as guid -> ...

您还可以在类型名称周围加上括号:

 match o with
    | :? (byte[]) as guid -> ...

 match o with
    | :? (byte array) as guid -> ...

答案 1 :(得分:2)

您可以使用printf%A格式说明符来打印数组:

printf "%A" [|0uy; 1uy; 2uy|]