これは単なる演習です(以下で説明する機能はすでにで実装されていることを認識していますList
)。
次の行を含むインターフェイスがあるとします
val length : 'a list -> int
val fold : init:'acc -> f:('acc -> 'a -> 'acc) -> 'a list -> 'acc
...そして私fold
はこのように実装します:
let rec fold ~init ~f l =
match l with
| [] -> init
| h :: t -> fold ~init:(f init h) ~f:f t
私は今length
、このように実装できると期待していました
let length = fold ~init:0 ~f:(fun c _ -> (c + 1))
...しかしコンパイラは文句を言う
Values do not match:
val length : '_a list -> int
is not included in
val length : 'a list -> int
もちろん、私はlength
このように実装できることを知っています
let length l = fold ~init:0 ~f:(fun c _ -> (c + 1)) l
...しかし、なぜl
両側から末尾を削除できないのかわかりません=
。
どこが間違っているのですか?
これが値の制限です。長さの定義は、非常に技術的な意味での値ではありません。Stack Overflowには、この問題に関するいくつかの良い議論がすでにあります。良いものを探します。
これはかなり良いものです:
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加