pasar pasaje parametros objetos metodos funciones expresiones entrada con como argumentos c# f#

c# - pasaje - Cómo escribir una función tomando el número variable de argumentos en F#



parametros de entrada en c# (2)

¿Quieres llamar a este método desde F # o C #? Esta publicación de hubFS parece indicar que F # no admite matrices de parámetros en el lado llamante, pero sospecho que si utiliza una anotación de tipo normal para que el parámetro sea una matriz, y también la decore con ParamArrayAttribute , debería poder Llámalo con argumentos variables de C #.

No puedo decir que haya visto cómo decorar un parámetro con atributos en F # todavía, pero puedo buscar si lo desea ... Esta publicación de blog da un par de ejemplos, pero no en el nivel de parámetro.

Tengo una función en C #, y me gustaría trasladarla (entre otras cosas) a F #, solo por hacerla. Desafortunadamente, acabo de encontrar un caso para el que parece que no hay manera de expresar esto en F #: tome esta función C #

public static T Min<T>(params T[] p) where T : IComparable { T m1 = p[0]; foreach (T v in p) { m1 = (m1.CompareTo(v) < 0) ? m1 : v; } return m1; }

Pensé que esto sería bastante fácil, pero no entiendo cómo especificaría una lista de argumentos variables en F #. He intentado esto:

let rec Min l = match l with | [] -> 0 // should throw exception here | [v] -> v | (h::t) -> min h (Min t)

pero llamando a eso desde C # espera un Microsoft.FSharp.Collections.List . ¿Es posible obtenerlo esperando un params T[] , y si es así, cómo?


Una matriz de parámetros es simplemente una matriz con un atributo, como señala Jon. Agregue el atributo antes del parámetro.

let test ([<ParamArray>] arr : ''a array) = if arr.Length = 0 then invalid_arg "arr" // ....

No es necesario especificar el tipo:

let test ([<ParamArray>] arr) = ... // lets type inference do its thing

Pero ... la coincidencia de patrones no funciona en el tipo de matriz. Podrías escribir un patrón activo para ayudar. Básicamente, tienes que decidir qué es más importante: el código F # o el código C #. La misma compensación se aplicará a medida que diseñe funciones de orden superior, use tuplas, use uniones discriminadas, etc. C # no puede expresar la mayoría de las cosas, y F # no admite actualmente algunos de los pequeños trozos de azúcar que C # tiene (Escrito en el Árbol de Expresiones el compilador, por ejemplo).