小编Hea*_*ink的帖子

引用在函数范围内定义的类

在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明确写出返回值的类型?

c++ scoping c++14

11
推荐指数
1
解决办法
192
查看次数

参考存在类型变量

我想在我的代码中为类局部函数添加类型签名.但是,它们的类型涉及匿名的,存在性绑定的类型变量.由于它们是匿名的,我不知道如何编写类型签名.我怎样才能引用这种类型变量?

在以下示例中,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)

haskell existential-type

9
推荐指数
1
解决办法
178
查看次数

从GHC中哄骗循环不变代码运动

我一直在努力进行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)

optimization haskell

7
推荐指数
1
解决办法
171
查看次数

标签 统计

haskell ×2

c++ ×1

c++14 ×1

existential-type ×1

optimization ×1

scoping ×1