Declare type list argument in F# -
i building simple function compares 2 lists , returns true
if first list prefix of second one. expected signature:
prefix: int list -> int list -> bool
for example:
prefix [1; 2] [1; 2; 3; 4] --> true prefix [ ] [1;2] --> true prefix [2] [1;2;3] --> false
right now, @ step:
let prefix l1 l2 = match l1 | (l1, l2) when (l1.[0] = l2.[0]) -> true | _ -> false
i think on right way, got error:
operator 'expr.[idx]' has been used on object of indeterminate type based on information prior program point. consider adding further type constraints
how can declare in prefix
l1
, l2
lists? looked solution here problem trivial there not answer.
to answer last part of question declaring types lists (since other parts answered already), use "type annotations". (name : type)
in function argument, such as
let prefix (l1 : _ list) (l2 : _ list) = ...
that declare both l1
, l2
lists of type compiler infer. can replace _
specific or generic type too, see fit.
for implementing function hand, remember you'll have go further comparing first element - you'll need recurse through lists.
let prefix l1 l2 = let rec loop = function | [], _ -> true | _, [] -> false | h1 :: _, h2 :: _ when h1 <> h2 -> false | _ :: t1, _ :: t2 -> loop (t1, t2) loop (l1, l2)
this version not need type annotations @ all, because pattern matches inside loop
constrain both arguments of type 'a list
. if wanted function explicitly int list
s, though, instead start with
let prefix (l1 : int list) l2 =
you need annotate 1 argument, because other constrained of same type.
Comments
Post a Comment