编译器不强制指定参数类型 - 这是一个错误还是预期的错误?

时间:2017-05-28 13:49:10

标签: elm

我已经看到这个代码编译没有错误,我不能说是否是一个错误或是否是它的预期。

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

1 个答案:

答案 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

使其正常工作..但两个代码片段应该是等效的。