通过拆自定义列表类型
问题描述:
如果我有以下几点:通过拆自定义列表类型
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
在第一种方法,你只是定义一个名字,但是编译器不会做任何检查,因此,如果您想使用类型标注的名称(例如,它是唯一有用的)t o让他们可读。
在第二种方法中,您确实定义了一种新类型,因此您确保使用StringList
的每个人都将使用您定义或使用的功能。
很难说这里有什么好的方法,因为StringList
不是很好的例子 - 它不能通过string list
传达任何附加信息。
+0
感谢您的回答。我正在做包装来获得类型安全,所以你的第二个选择正是我所缺少的。非常感谢你! –
_Context:刚开始学习F#._ –