在C++ 1y中,函数的返回类型可能涉及本地定义的类型:
auto foo(void) {
class C {};
return C();
}
Run Code Online (Sandbox Code Playgroud)
类名C
不在主体范围之外foo
,因此您可以创建类实例但不指定其类型:
auto x = foo(); // Type not given explicitly
decltype(foo()) y = foo(); // Provides no more information than 'auto'
Run Code Online (Sandbox Code Playgroud)
有时需要明确指定类型.也就是说,编写"在foo中定义的类型C"而不是"foo返回的任何类型"是很有用的.有没有办法foo
明确写出返回值的类型?
我想在我的代码中为类局部函数添加类型签名.但是,它们的类型涉及匿名的,存在性绑定的类型变量.由于它们是匿名的,我不知道如何编写类型签名.我怎样才能引用这种类型变量?
在以下示例中,go
具有type [b] -> Int -> Int
,其中b
是由模式匹配绑定的类型T (x_shared:xs) g
.我可以为它写什么类型的签名?
data T = forall a. T [a] (a -> a -> Int)
f :: T -> Int
f (T (x_shared:xs) g) = go xs 0
where
-- go :: what type?
go (x:xs) n = go xs $! n + g x_shared x
go [] n = n
Run Code Online (Sandbox Code Playgroud) 我一直在努力进行GHC中的低级手动循环优化.我的程序包含一些执行数值计算的循环.真实数据包含在其他数据结构中,并且程序被分解为"循环控制流函数"和"计算函数",使得一些数据结构字段最终在内部循环内被读取.我希望GHC将这些读取移出内部循环.这是代码的简化版本,用于显示正在发生的事情.
data D = D !Double !C
data C = C Double
-- This function is called in every loop iteration.
-- Parameter 'c' is loop-invariant.
exampleLoopBody i a c =
case c of C b -> a + b * fromIntegral i
-- The body of this function is a counted loop that should be optimized
foo x =
case x
of D acc0 c ->
let loop i acc =
if i > 100
then acc
else loop …
Run Code Online (Sandbox Code Playgroud)