我已经看到这个代码编译没有错误,我不能说是否是一个错误或是否是它的预期。
type alias Foo = List
vs
type alias Foo = List String
并不仅仅是List
。也允许自定义联合类型。例如:
type State value = Valid value | Invalid value
type alias Model1 =
{ someField : State String } -- i would say this is normal. State is a string..
type alias Model2 =
{ someField : State } -- this doesn't look right.
并且还允许使用函数
function1 : List String -> Int
function1 aListOfStrings =
1
function2 : List -> Int
function2 whatisThisNow =
1
但是如果有预料 - 如何推理?我无法绕过它。与它一起玩here。
答案 0 :(得分:1)
第一个看起来没问题。定义type alias Foo = List
应该允许您使用Foo
代替List
。但它没有编译(使用Elm 0.18):
type alias Foo = List
names : Foo String --does not compile
names = ["a", "b"]
在声明时似乎没有完全检查类型别名,因此可以创建根本无法使用的类型别名。
对于第一个示例,可以修复编译器以正确支持它。第二个示例应该是编译时错误,因为无法获得类型List
(或State
)的值。 Haskellers会说List
(或State
)有* -> *
种类,但运行时的值只能有*
种类。
我猜您在当前的Elm版本中发现了一个错误(0.18)
有趣的是,将上面的代码更改为
type alias Foo a = List a
names : Foo String
names = ["a", "b"]
-- compiles with Elm 0.18
使其正常工作..但两个代码片段应该是等效的。