where
子句中的tutorial部分提供了两个条件,可以在f
子句中省略函数where
的类型声明:
f
出现在顶级定义的右侧f
的类型可以从第一个应用程序中完全确定
我的问题是:这两个条件之间的关系是什么? '和','或','互相排斥',是否有人暗示对方?
答案 0 :(得分:3)
必须满足这两个条件,例如:
test1 : List Int -> List Int
test1 xs = map inc xs
where
inc a = 1 + a
让我们看一下反例,其中只有一个条件得到满足。
test2 : List Int -> List Int
test2 xs = map proxy xs
where
inc a = 1 + a
proxy : Int -> Int
proxy a = inc a
此处,inc
未显示在右侧,但可以确定为Int -> Int
。
test3 : List Int -> List Int
test3 xs = map (cast . inc . cast) xs
where
inc a = 1 + a
接下来,inc
出现在右侧,但无法确定类型(因为它可能是Nat -> Nat
,Int32 -> Int32
,...),因此cast
的类型1}}不能。
test2
和test3
只有在向inc
提供类型声明时才会编译。