如果我有以下情况:
type StringList = StringList of string list
let sl = StringList [ "Hello, "; "World" ]
let length = List.length sl
然后会引发以下编译器错误:
This expression was expected to have type 'a list but here has type StringList
我的理解是,这StringList
是一个option
“包装” string list
,那么我如何“包装”它,以便可以List
在其上调用方法?
问题是您的StringList
类型正在定义一个新的类型,该类型是包装器string list
。可以使用的功能string list
在您的包装上不起作用,因为它们对此一无所知。
您可以将其定义StringList
为类型别名-因此,与其定义新的类型,不如定义一个新的类型:
type StringList = string list
let sl : StringList = [ "Hello, "; "World" ]
let length = List.length sl
另一种选择是string list
在调用之前提取值List.length
:
type StringList = StringList of string list
let stringListlength (StringList(slData)) =
List.length slData
let sl = StringList [ "Hello, "; "World" ]
stringListlength sl
在第一种方法中,您只是定义一个名称,但是编译器不会对此进行任何检查,因此,仅当您想在类型注释中使用该名称(例如)以使名称可读时,它才有用。
在第二种方法中,您实际上是在定义一个新的类型,因此要确保与之共事的每个人都StringList
将使用您定义或与其一起使用的功能。
这里很难说什么是好的方法,因为StringList
这不是一个很好的例子-它实际上并没有传达任何其他信息string list
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句