2016-02-18 6 views
6

なぜ次のような出力が得られますか?F#List.lengthは常に1を返しますか?

> List.length [1,2,3];; 
val it : int = 1 
> List.length [1,2,3,4];; 
val it : int = 1 

私は3と4を​​得る予定です!間違った関数呼び出しを使用していますか?

+0

これは下に回答されましたが、気分が悪くありません。これは実際にはよくある間違いです:) – TheQuickBrownFox

答えて

16

これは機能に関するものではなく、リストの項目を入力する方法です。 ;の代わりに,を使用してください。

> List.length [1,2,3];; 
val it : int = 1 
> List.length [1;2;3];; 
val it : int = 3 

理由は[1,2,3]はただ一つの項目とのタプルのリストであるということである。

> [1,2,3];; 
val it : (int * int * int) list = [(1, 2, 3)] 

は出力に(..)を参照してください - 悲しげにあなたが(..)外でタプルを入力することができ、多くの秋それのために

;を代わりに使用すると、のintsのリストが3つの要素で表示されます。

> [1;2;3];; 
val it : int list = [1; 2; 3] 
+1

タプルカッコのオプション性はなぜ悲しいことでしょうか?その定型句の必要はありません:-)リストがもっと意味のあるものに使われると、型はこのようなエラーを防ぎます。 – CaringDev

+1

これは、一貫性のあるIMOのことです。これは、入力[1,2,3]を(出力のように)[(1,2,3)]と比較すると読みやすくなります。クリア? - これは常時起こる一般的な間違いです。特にHaskell、Javascript、Pythonのようなものを知っていれば、 '、'を使用します。 – Carsten

+1

可読性は文脈の関数でもあります。ここで私はカッコを入れます。例えば。関数型のシグネチャでは、型付きのタプルを使用して、それらを一貫性のあるままにしておくと読みやすくなります。新しい開発者 '(1、" a "):int * string'、つまり'、 'と' * 'は最初は難しいです。しかし、IMOの言語は、最初の習得の前に(安全性が損なわれていない限り)あなたができること(いいDSLなど)を評価する必要があります。他のすべてのツールと同じように、それをやりすぎないようにする方法(スカラコレクション演算子など)も学ぶ必要があります。このために威力を失うことは悲しいでしょう。 – CaringDev

関連する問題