Chcę dokonać funkcji, która wykonuje listę i operator i wykonaj tę operację na wszystkich elementach tej listy.

Problem polega na tym, że podczas wykonywania funkcji pomocniczej nie wiem, jak zainicjować dodatkowy parametr do "NULL" DataType, którego funkcja przyjmie jako wejście.

Na przykład, jeśli mamy do czynienia z intami, chciałbym, aby mój parametr wziąć wartość 0, 0. Z pływakami i ciągów "".

Z góry dziękuję !

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) (ret:'a) = match li with
  | [] -> va
  | h :: t -> combine_all_aux va op t (op ret h)
;;

let combine_all va op li =
  combine_all_aux va op li (Something)
;;
0
Ivan 22 marzec 2020, 02:22

2 odpowiedzi

Najlepsza odpowiedź

Pierwszą rzeczą, którą zauważam, jest to, że kod, jak podany, zawsze zwraca va. Po upływie do końca listy ignoruje nagromadzoną wartość ret.

Z tego powodu trudno jest zrozumieć dokładnie, co powinna zrobić funkcję. Czy powinniśmy rozważyć va, aby być na końcu listy lub na początku? Czy wdrażasz właściwą fałdę lub lewą fałdę?

Powiedzmy, że wdrażasz lewą fałdę, a {x0}} ma być na końcu listy. Następnie połączenie:

combine_all va op [e1; e2; e3]

Jest równoważny z tym wyrażeniem (za pomocą +, aby reprezentować parametr op):

(((e1 + e2) + e3) + va)

Jeśli to właśnie dążyłeś, jednym rozwiązaniem, które wystąpi do mnie, jest rozważenie listy li @ [va]. Ta lista jest pusta przez konstrukcję. Dlatego zawsze możesz wyodrębnić głowę listy i używać go jako początkowej wartości skumulowanej (która nazywasz ret). Następnie stosujesz funkcję rekurencyjnej do ogona li @ [va].

Jeśli powinien być uważany za na początku listy, rzeczy są jeszcze łatwiejsze. Masz już głowę i ogon nieustannej listy operandów: va jest głową, a li jest ogonem.

2
Jeffrey Scofield 22 marzec 2020, 00:06

Dzięki @Jeffrey napisałem funkcję za pomocą głowy jako akumulatora, który usuwa potrzebę dodatkowego parametru.

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) = match li with
  | [] -> va
  | h :: t -> op h (combine_all_aux va op t)
;;
0
Ivan 25 marzec 2020, 13:09