F#List.length是否始终返回1?
为什么我得到下面这样的输出F#List.length是否始终返回1?,list,f#,List,F#,为什么我得到下面这样的输出 > List.length [1,2,3];; val it : int = 1 > List.length [1,2,3,4];; val it : int = 1 我期望得到3分和4分!我是否使用了错误的函数调用?这与函数无关,而是与您输入列表项的方式有关。您使用,而不是 > List.length [1,2,3];; val it : int = 1 > List.length [1;2;3];; val it : int = 3 原
> List.length [1,2,3];;
val it : int = 1
> List.length [1,2,3,4];;
val it : int = 1
我期望得到3分和4分!我是否使用了错误的函数调用?这与函数无关,而是与您输入列表项的方式有关。您使用
,
而不是代码>
> 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)]
请参见输出中的(..)
——遗憾的是,您可以在不输入(..)
的情况下输入元组,而且许多人都喜欢它
如果您使用代码>相反,您会得到一个包含3个元素的int列表:
> [1;2;3];;
val it : int list = [1; 2; 3]
为什么元组括号的可选性会是一件悲哀的事情?无需使用该样板文件:-)一旦列表用于更有意义的内容,类型将防止此类错误。在我看来,这是一个一致性的问题,也是一个可读性的问题-当您将输入[1,2,3]
与[(1,2,3)]
(与输出一样)-哪一个更清楚此外,这是经常发生的一个常见错误,尤其是如果你知道Haskell、Javascript或Python之类的东西,它们都使用,
…可读性也是上下文的函数。这里我要用括号括起来。例如,在函数签名中,使用带类型注释的元组,将它们省略(在这里和那里保持一致)可能更具可读性。对于新开发人员来说,(1,“a”):int*string
,即,
与*
的对比起初也很困难。但在我看来,一门语言应该根据你在初始学习曲线之前能做什么(例如,漂亮的DSL)来评分(考虑到安全性不受影响)。与其他所有工具一样,还需要学习如何避免过度使用(例如Scala集合操作符)。如果你愿意,我们可以在别处讨论这个问题,但我认为这里的注释部分不是一个好地方经验法则是,在F#中,逗号是一个创建或分解元组的运算符。撇开泛型类型定义不谈,这就是它所做的一切。下面回答了这个问题,但请不要感到难过。这是一个非常常见的错误:)