Also, zunächst einmal, du hast markieren nicht l
als int list
, die Syntax:
let any_zeroes l: int list
Bedeutet, dass die any_zeroes
eine Funktion ist, die ein int list
zurückgibt. Ein richtiger Weg, es zu annotieren, ist die folgende:
let any_zeroes (l : int list) : bool
Zweitens ist die Tatsache, dass Sie Marke etwas nicht die Semantik eines Programms ändern. Es ist eine Typbeschränkung, die dem Typschlussfolgerungssystem sagt, dass dieser Typ zu dem, was Sie angeben, vereinheitlicht werden soll. Wenn ein Typprüfer das nicht kann, wird er mit einem Fehler gerettet. Und Type Checker brauchen Ihre Einschränkungen nicht, sie werden meist zur besseren Lesbarkeit hinzugefügt. (Ich denke, sie werden auch von dem Kurs benötigt, den du nimmst).
Schließlich weist der Fehler Sie nicht auf die l
(dass, wie Sie denken, wurde annotiert), sondern auf die 0
. Und die Nachricht teilt Ihnen mit, dass die Funktion List.exists
eine Funktion des Typs 'a -> bool
als erstes Argument akzeptiert, aber Sie versuchen, sie mit 0
mit dem Typ int
zu versorgen. Also, das Typsystem versucht, int
und 'a list
zu vereinheitlichen, und es gibt keine solche 'a
, die int = 'a list
, so dass es nicht überprüfen. Sie müssen also entweder eine Funktion übergeben oder List.mem
verwenden, wie von Anton vorgeschlagen.
Verwenden Sie stattdessen 'List.mem'. –