通过拆自定义列表类型

问题描述:

如果我有以下几点:通过拆自定义列表类型

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 

我的理解是,StringListoption“包装” string list,所以我怎么“打开”它,这样我可以打电话给List方法呢?

+0

_Context:刚开始学习F#._ –

问题是您的StringList类型正在定义一个新类型,该类型是string list的封装类型。可以在string list上运行的函数在你的包装器上不起作用,因为他们对它没有任何了解。

您可以定义StringList作为一个类型别名 - 因此而不是定义一个新类型,它只是同一事物的一个方便的名字:

type StringList = string list 
let sl : StringList = [ "Hello, "; "World" ] 
let length = List.length sl 

另一种选择是在调用之前提取string listList.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

感谢您的回答。我正在做包装来获得类型安全,所以你的第二个选择正是我所缺少的。非常感谢你! –