Lista de enlaces f#implementada con registros
linked-list (1)
Estoy tratando de implementar una lista enlazada en f # usando registros. Sé que puedo usar la compilación en el tipo de lista, pero esto es para fines de aprendizaje. Mi tipo es:
type Cell = { data : int; next : RList}
and RList = Cell option ref
Y me gustaría hacer una función de inserción simple, pero me dijeron que f # está esperando un booleano, pero se le dio una expresión de unidad de tipo. Me pregunto si esto significa que he formateado mi sentencia if / else incorrectamente
let rec insert comp (item: int) (list: RList) =
let c = {data = item; next = ref None}
match !list with
| None -> list = cellToRList c
| Some {data = d; next = remaining} ->
if (comp(item, d)) then
c.next := !remaining
remaining := ref c (* compiler indicates error here *)
else insert comp item remaining
Nota: comp es cualquier función de comparación tomando (elemento, d) como entrada y dando salida a verdadero o falso ex:
let compare (x, y) = x > y
Mi objetivo es simplemente insertar una nueva celda con datos = ítem si comparo salidas verdaderas. En el ejemplo anterior, podría usarse para insertar en una lista ordenada y mantener la ordenación. Toda la función debería devolver la unidad de tipo. Cualquier sugerencia sobre por qué mi intérprete está buscando un booleano sería muy apreciado.
Nota: soy muy nuevo en F #
====
Corregido con mejoras Cortesía de Foggy, Mikhail y Fyodor
type Cell = { data : int; next : (Cell option) ref}
let rec insert compare (item: int) (list: (Cell option) ref) : unit =
let c = {data = item; next = ref None}
match !list with
| None -> list := Some c
| Some {data = d; next = remaining} ->
if (compare(d, item)) then
c.next := !remaining
remaining := Some c
else insert compare item remaining
Usted devuelve un bool de su coincidencia de None
:
| None -> list = cellToRList c
El signo de igual es un operador de comparación aquí. Entonces el compilador deduce la función para devolver bool
, mientras que supongo que tu intención es devolver la unit
.
En cualquier caso, siempre que no comprenda los tipos inferidos de sus funciones, intente anotarlos explícitamente. En tu caso, hazlo
let rec insert comp (item: int) (list: RList) : unit =
Y verás el problema que describí arriba.
Es posible que desee eliminar la anotación de tipo una vez que todo se compila.