Usando ListPair.foldr para implementar zipWith en SML

Antecedentes: nivel principiante en SML

Mi asignación requiere que use ListPair.foldr y solo esta función para implementar la función zipWith.

ListPair.foldr : ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c
zipWith : ('a * 'b -> 'c) -> 'a list -> 'b list -> 'c list

ListPair.foldr devuelve un solo elemento 'c, mientras que zipWith devuelve una lista' c ', así que, naturalmente, mi enfoque usaría ListPair.foldr repetidamente para difundir elementos' c 'individuales que luego puse en mi lista' c '. ListPair.foldr toma un par de listas y las pliega unas sobre otras de acuerdo con la función suministrada, por lo que la única manera de obtener el efecto deseado sería tomar un elemento de cada lista a la vez, alimentarlo a ListPair.foldr como un Par de listas, tome el resultado y concatene para la siguiente ronda. También tendría que convertir la función de ('a *' b -> 'c) a (' a * 'b *' c -> 'c). Al igual que:

fun zipWith f [] l2 = []
| zipWith f l1 l2 = 
let val f2 = fn (a,b,c)=> f(a,b)+c   (* converting the function *)
    val xh = [hd(l1)]      (*first element of 'a list, as a list itself *)
    val yh = [hd(l2)]      (*first element of 'b list, as a list itself *)
    val xt = tl(l1)        (*taking the tail of 'a list*)
    val yt = tl(l2)        (*taking the tail of 'b list*)
in
    ListPair.foldr f2 0 (xh, yh)::    (*perform the operation with the two heads*)
    zipWith f xt yt                   (*recursively call zipWith with the remainder*)
end;

Esto funciona.

- zipWith (fn (x,y)=>x+y) [1,2,3] [10,20,30];
val it = [11,22,33] : int list

Pero ahora la parte difícil: no debo hacer esto recursivamente, es decir, no puedo llamar a zipWith dentro de mi función zipWith. ¿Es esto posible? Por lo que leí, la función zipWith real en Haskell se define recursivamente; ¿Cómo hago esto de manera no recursiva?

No puedo imaginar al profesor instándonos a que hagamos esto de una manera orientada a objetos con bucles while y demás (lo intenté de todos modos, mi nivel no es adecuado ni siquiera para eso).

¿Estoy en la dirección completamente equivocada? ¿Cómo debo abordar esta pregunta?

-----------------Contestado----------------

Al principio intenté la solución de la almohadilla al principio:

fun zipWith f l1 l2 = 
let val f2 = fn (a,b,c)=> f(a,b)::c
in
    ListPair.foldr f2 0 l1 l2
end;

Pero no funcionó porque lo estaba agregando a 0 en lugar de []. Los tipos no funcionaron y no pude resolverlo!

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta