Citat:
Ursprungligen postat av Testpelle
Kod:
fun testar (c0:real,c1:real) [] = []
| testar (c0:real,c1:real) (x::xs) =
let
val (_,_,d1) = x
in
if((d1>=c0)andalso(d1<c1)) then
d1::testar (c0,c1) (xs)
else
testar (c0,c1) (xs)
end;
fun collectCarats [] [] = []
| collectCarats (c0::c1::cs) (x::xs) =
(testar(c0,c1) (x::xs)) :: [];
Jag vill kunna öka värdena i sista raden (testar(c0,c1) till (testar(c1,c2) på ett smidigt sätt.
Cs är en lista med tal i stigande ordning och xs en lista med olika element som ska testas om de ligger mellan c0 och c1.
Hm, för det första verkar det vara fel på din rekursion i collectCarats eftersom du aldrig gör ett rekursivt anrop till den funktionen i funktionskroppen.
Som jag förstår det vill du ha en lista med de tal som ligger mellan c0 och c1?
Om du bara vill kunna ändra tester(c0,c1) till testar(c1,c2) är det bara att du mönstermatchar ut c2 i collectCarats
| collectCarats(c0::c1::c2::cs)
Om jag var du skulle jag nog titta på högre ordningens funktioner och de inbyggda funktionerna för List-datatypen.
Ifall du vill hitta alla tal som ligger mellan a och b i en lista räcket denna funktion.
fun range(upper, lower, list) =
List.filter (fn x => (x >= upper andalso x <= lower) list;