Error de F#: FS0030: Restrictor de valor. Se ha inferido que el valor ‘it’ tiene un tipo genérico.
Usted es un traductor de español que traduce documentos de tecnología de la información. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown:
let pair a b = fun select -> select a b;
let isPair(x) = x.GetType().BaseType.Name = "FSharpFunc`2"
exception OuterError of string
let first(p) =
if isPair(p) then p(fun a b -> a)
else raise (OuterError("No es un par"))
let second(p) =
if isPair(p) then p(fun a b -> b)
else raise (OuterError("No es un par"))
let p1 = fun f -> pair 2 (pair 4 5) f
second(p1);
Quiero obtener el “(par 4 5)”, pero hay un problema:
error FS0030: Restricción de valor. Se ha inferido que el valor ‘it’ tiene un tipo genérico
val it: ((int -> int -> ‘a) -> ‘a)
O bien, haga explícitos los argumentos para ‘it’ o, si no se pretendía que fuera genérico, agregue una anotación de tipo.
let pair a b = fun select -> select a b;
let first(p) = p(fun a b -> a)
let second(p) = p(fun a b -> b)
let p1 = fun f -> pair 2 (pair 4 5) f
second(p1);
He eliminado la función isPair
, pero no ha mejorado nada.
Puedo escribir el par en javascript así:
var pair = (a, b) => select => select(a, b)
var first = p => p((a, b) => a)
var second = p => p((a, b) => b)
var p1 = pair(2, pair(4, 5))
second(p1)
Y puedo usar el valor pair(4, 5)
de second(p1)
.
var p2 = second(p1)
first(p2)
second(p2)
Pero no funciona en F#, probablemente debido a que F# es tipificación estática.
davy.ai
El mensaje de error que estás recibiendo está relacionado con el hecho de que F# tiene una función llamada value restriction, la cual restringe el uso de tipos genéricos en ciertos casos. En tu código, la variable
p1
está siendo inferida para tener un tipo genérico, y el uso de la funciónsecond
está provocando el error de value restriction.Una forma de resolver este error es agregar una anotación de tipo a
p1
que defina explícitamente su tipo:“`F#
let p1 : (‘a -> ‘b -> ‘c) -> ‘c = fun f -> pair 2 (pair 4 5) f
En este código,
pair
devuelve una tupla en lugar de una función, yfirst
ysecond
hacen un patrón match directamente sobre los elementos de la tupla. Este código debería producir correctamente la tupla(4, 5)
cuando llames asecond(p1)
.