从一个函数返回不同维度的数组;在F#中有可能吗?

时间:2016-01-04 21:10:53

标签: arrays f#

我正在尝试将一些Python转换为F#,特别是numpy.random.randn

该函数接受可变数量的int参数,并根据参数的数量返回不同维度的数组。

我认为这是不可能的,因为一个人不能有一个返回不同类型的函数(int[]int[][]int[][][]等),除非他们是受歧视联盟的一部分,但在提交解决方法之前要确定。

理智检查:

member self.differntarrays ([<ParamArray>] dimensions: Object[]) =
    match dimensions with
    | [| dim1 |] ->      
         [| 
            1 
         |]
    | [| dim1; dim2 |] -> 
        [|
           [| 2 |], 
           [| 3 |] 
        |]
    | _ -> failwith "error"

导致错误:

This expression was expected to have type  
    int    
but here has type  
    'a * 'b 

expression为:[| 2 |], [| 3 |]int指的是[| 1 |]中的1 即1的类型与[| 2 |], [| 3 |]

的类型不同

TLDR;

numpy.random.randn

  

numpy.random.randn(d0,d1,...,dn)

     

从“标准正常”分布中返回一个或多个样本。

     

如果提供了正数,则提供了int_like或int-convertible参数,randn   生成一个形状数组(d0,d1,...,dn),随机填充   从单变量“正常”(高斯)分布采样的浮点数   均值0和方差1(如果任何d_i是浮点数,它们是第一个   通过截断转换为整数)。单个浮点随机抽样   如果没有提供参数,则返回分布。

交互式python会话中的示例:

np.random.randn(1)  - array([-0.28613356])
np.random.randn(2)  - array([-1.7390449 ,  1.03585894]) 
np.random.randn(1,1)- array([[ 0.04090027]])
np.random.randn(2,3)- array([[-0.16891324,  1.05519898, 0.91673992],  
                             [ 0.86297031,  0.68029926, -1.0323683 ]])

代码适用于Neural Networks and Deep Learning,由于性能原因值必须是可变的,因此使用不可变列表不是一种选择。

2 个答案:

答案 0 :(得分:4)

你是对的 - 浮点数float[]的数组与浮点数组的数组不同 float[][]或浮点数float[,]的二维数组,因此您无法根据输入参数编写返回一个或另一个的函数。

如果你想做Python的rand之类的事情,你可以写一个重载的方法:

type Random() = 
  static let rnd = System.Random()
  static member Rand(n) = [| for i in 1 .. n -> rnd.NextDouble() |]
  static member Rand(n1, n2) = [| for i in 1 .. n1 -> Random.Rand(n2) |]
  static member Rand(n1, n2, n3) = [| for i in 1 .. n1 -> Random.Rand(n2, n3) |]

答案 1 :(得分:1)

尽管Tomas建议使用重载可能是最好的,但.NET数组确实共享一个共同的子类型:System.Array。所以你想要的是可能的。

member self.differntarrays ([<ParamArray>] dimensions: Object[]) : Array =
    match dimensions with
    | [| dim1 |] ->      
         [| 
            1 
         |] :> _
    | [| dim1; dim2 |] -> 
        [|
           [| 2 |], 
           [| 3 |] 
        |] :> _
    | _ -> failwith "error"