小编Cli*_*ton的帖子

混合类型模式匹配和记录语法

可以说我的函数有以下(人为的示例)f

data T where
  T :: (Typeable a, Integral a) => { first :: a, second :: a } -> T

printType :: forall a. Typeable a => String
printType = show $ typeRep (Proxy :: Proxy a)

f :: T -> String
f (T first second) = show (toInteger first, toInteger second)
Run Code Online (Sandbox Code Playgroud)

我也可以使用记录语法:

f (T {first, second}) = show (toInteger first, toInteger second)
Run Code Online (Sandbox Code Playgroud)

但假设我想打印该类型。然后我使用类型应用程序:

f (T @a first second) = printType @a ++ ": " ++ show …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

6
推荐指数
1
解决办法
94
查看次数

在小于 O(n^2) 的时间内查找通配符重叠

假设我有一个长度相等的元组列表,其中每个元素都是整数或“星号”,例如:

[
(1, 2, *, 4, 5),
(1, *, 3, 4, 6),
(1, *, 3, 4, 5),
(1, 2, 3, 4, 6),
(4, *, *, 5, 6),
(*, *, 1, 5, 6)
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,元素 1 和 3 重叠,2 和 4 重叠,5 和 6 重叠。

有没有一种方法可以在比简单方法更短的时间内确定是否存在重叠(我实际上不需要所有重叠,只需回答是否没有重叠或至少有一个重叠),即检查所有可能的对(其中是O(n^2)自然的)。

评论的澄清

  • n上面给出的是行数。这就是可能变得很大的事情。出于此问题的目的,假设列数相对较小,例如不超过 20。

  • “星星”恰好代表一种元素。

algorithm

6
推荐指数
1
解决办法
160
查看次数

翻转半群运算的 Haskell 新类型?

基础中是否有任何新类型基本上可以实现以下目标?

newtype SemigroupFlip a = SemigroupFlip a

instance Semigroup a => Semigroup (SemigroupFlip a) where
  (SemigroupFlip a) <> (SemigroupFlip b) = SemigroupFlip (b <> a)

instance Monoid a => Monoid (SemigroupFlip a) where
  mempty = SemigroupFlip mempty
Run Code Online (Sandbox Code Playgroud)

haskell monoids semigroup

6
推荐指数
1
解决办法
196
查看次数

完美转发

如果我们有以下内容:

template <class T>
struct B{
  T data;
}

struct A{
  int data_array[100];
}

int main()
{
  A x;
  const A x_const;

  auto y1 = f(A());
  auto y2 = f(x);
  auto y3 = f(x_const);
  auto y4 = f(std::move(x));
}
Run Code Online (Sandbox Code Playgroud)

我想知道f(最好是功能,但宏也可以),这样:

decltype(y1) == B<A>
decltype(y2) == B<A&>
decltype(y3) == B<const A&>
decltype(y4) == B<A&&>
Run Code Online (Sandbox Code Playgroud)

也就是说,f完美地x转化为一个对象B.

c++ forwarding decltype c++11

5
推荐指数
2
解决办法
931
查看次数

在 Linux 上访问第六代 iPod nano

我一直在尝试在 Linux 上访问第六代 iPod nano。我尝试了Debian Squeeze自带的gtkpod,似乎不支持第6代nano。所以我在 wine 下尝试了 iTunes,它几乎没有安装并且功能不是很好。然后我在wine下尝试了foobar2000,它确实安装了,但似乎没有检测到我的ipod。

我现在尝试编译 gtkpod 2.0.2,但是在尝试编译 libgpod 时遇到 libtool 问题,我什至不知道 gtkpod 2.0.2 是否支持第六代 nano,尽管我确实看到了一些参考文献到 gtkpod 变更日志中的第六代 nano。

有人知道这里最好的方法吗?

ipod ipod-nano

5
推荐指数
1
解决办法
5092
查看次数

C++ 11:为什么允许分配rvalues?

根据我的理解,返回rvalues对函数的引用是危险的原因是由于以下代码:

T&& f(T&& x) { do_something_to_T(x); return static_cast<T&&>(x); }
T f(const T& x) { T x2 = x; do_something_to_T(x2); return x2; }
T&& y = f(T());
Run Code Online (Sandbox Code Playgroud)

这留下y了一个未定义的悬空参考.

但是,我不明白为什么上面的代码甚至编译?是否有合理的理由将rvalue引用分配给另一个右值引用?粗略地说,rvalues不应该是"临时",即在表达结束时会变得无效吗?能够分配它们对我来说似乎很愚蠢.

c++ rvalue rvalue-reference c++11

5
推荐指数
1
解决办法
3148
查看次数

为什么+ =标准库中的有效临时值?

当我尝试在ideone上编译以下内容时:

class X
{
  public:
   friend X& operator+=(X& x, const X& y);
};

X& operator+=(X& x, const X& y) { return x; }

int main()
{
  X() += X();
}
Run Code Online (Sandbox Code Playgroud)

正如所料,这会引发编译错误,因为您无法将临时传递给非const引用.

但是,以下内容在ideone上成功编译:

std::string() += std::string();
Run Code Online (Sandbox Code Playgroud)

不应该像我上面的例子那样出错吗?

编辑:

如果std :: string()定义+=为成员操作,为什么在这样的用法允许左侧是临时的时候呢?为什么不像我上面那样定义它并避免引用临时问题?

c++ temporary

5
推荐指数
1
解决办法
158
查看次数

部分应用函数的`seq`

可以说我有以下内容:

f :: a -> b -> c
g :: b -> c
g = f 10
Run Code Online (Sandbox Code Playgroud)

现在让我们说f实际上:

f x y = f1 x + y
Run Code Online (Sandbox Code Playgroud)

将:

g `seq` ...
Run Code Online (Sandbox Code Playgroud)

实际上是评估f1 10,所以以后运行时

g 9
Run Code Online (Sandbox Code Playgroud)

它实际上只是一个简单的添加?

如果没有,有没有办法"评估"部分应用功能的部分?

我在寻找一个通用的解决办法,不依赖于知道如何fg工作.

haskell seq

5
推荐指数
2
解决办法
162
查看次数

Haskell类型系列,了解错误信息

在尝试使用时Data.Has,我一直在编写如下代码:

data Name = Name; type instance TypeOf Name = Text
type NameRecord = FieldOf Name;
Run Code Online (Sandbox Code Playgroud)

我发现:

instance I NameRecord where
  ...
Run Code Online (Sandbox Code Playgroud)

引发编译错误,即:

实例中的非法类型同义词系列应用程序

鉴于:

instance (NameRecord ~ a) => I a where
  ...
Run Code Online (Sandbox Code Playgroud)

编译好.

我认为该错误与GHC中的票证有关,标记为无效.

对机票的回应说:

我不确定你在暗示什么.我们无法自动转换

instance C (Fam Int) -- (1)
Run Code Online (Sandbox Code Playgroud)

instance (Fam Int ~ famint) => C famint -- (2)
Run Code Online (Sandbox Code Playgroud)

如果只有一个实例,则此方法有效,但只要有两个这样的实例,它们就会重叠.

也许你建议我们应该这样做,程序员应该只考虑隐式转换.我认为这不是一个好主意.令人困惑的是很少的好处(因为你总是可以轻松地自己编写转换后的实例).

有人可以详细说明这个解释,可能有一些示例代码,其中(1)失败,但(2)没有,为什么?

haskell type-families

5
推荐指数
1
解决办法
332
查看次数

链接Haskell函数的数据类型

可以说我有以下内容:

data FuncAndValue v res = FuncAndValue (v -> res) v

chain :: (res -> new_res) -> FuncAndValue v res -> FuncAndValue v new_res
chain new_f (FuncAndValue old_f v) = FuncAndValue (new_f . old_f) v  
Run Code Online (Sandbox Code Playgroud)

被GHC可能能够结合功能new_fold_f通过内联成一个单一的功能?

基本上,以数据类型存储函数无论如何都会抑制优化.

我希望GHC能够轻松地将函数链组合成一个(即所以我的结构上的"总和"不涉及重复调用代表的thunk,(+)而只是内联,(+)因此它像for循环一样运行.我希望将函数存储在数据类型中,然后稍后访问它们不会抑制它.

haskell ghc

5
推荐指数
1
解决办法
216
查看次数