小编Cli*_*ton的帖子

强制类型类字典有多不安全?

我遇到的情况是,我有一个产品类型(例如),以及一个使用 deriving 派生的Tsay 实例,它可以工作,因为 的每个成员都是 的实例。CanyclassTC

我将 的一个成员更改T为不是 的实例的类型C(让我们调用这个新成员的类型U)。请注意, 和CU来自外部库,T在我自己的代码中。这给我留下了一些选择,我想到了:

  1. 尝试手动定义一个实例C T,这需要我深入研究通用实现并基本上复制粘贴它。
  2. 定义一个孤立实例C U(因为我不控制C也不U)。
  3. Newtype U(例如V U)并将成员更改为 type V

但我真的不喜欢这些解决方案:

  1. T当通用派生实例运行良好时,我真的不想手动复制粘贴破解整个手动实例。
  2. 我可以创建一个孤儿实例(诚然,我认为这是三个方法中最好的方法),但我仍然听说孤儿实例并不好,因为如果它们在继承层次结构中作为每个模块使用,它们可以增加编译时间获得传递依赖于它们的编译必须检查孤立模块的接口文件。还有“孤儿不好”的争论。
  3. 仅仅为了处理这个实例而进行新的打字似乎是一种矫枉过正。我想我可以编写一个打开新类型的访问器,但这并不能解决所有问题,就像如果我想使用{}样式语法打开类型一样,我仍然必须强制结果。所有这些黑客行为只是为了处理一个讨厌的实例。

所以,我的想法是,我只需要在这个地方提供我的自定义实例,而不是我的整个程序。

所以我定义了 a newtype V = V U,并定义了我的实例C V。但我没有改变类型T。相反,我使用该库编写了以下函数,并结合了我从此处此处constraints获得的一些想法:

import Data.Coerce (Coercible, …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass

10
推荐指数
0
解决办法
162
查看次数

表达式模板和范围基于C++ 11

据我所知,表达式模板将在C++ 11中基于范围而中断,因为for (auto x : expr)它具有隐含性auto&& __range = expr,这将导致悬空引用.

有没有办法创建表达式模板类,以便它们能够正确地使用基于范围的行为,或者至少抛出编译错误?

基本上,我想防止表达式模板正确编译但由于悬空引用而在运行时失败的可能性.我不介意在基于for的范围内使用表达式模板之前必须将表达式模板包装起来,只要在用户忘记包装表达式模板时没有静默运行时错误.

c++ expression-templates c++11

9
推荐指数
2
解决办法
543
查看次数

防止表达式模板绑定到右值引用

我理解做类似以下的事情:

auto&& x = Matrix1() + Matrix2() + Matrix3();
std::cout << x(2,3) << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果矩阵运算使用表达式模板(例如boost::ublas),将导致静默运行时错误.

是否有任何设计表达式模板的方法来防止编译器编译可能导致在运行时使用过期临时值的代码?

(我尝试解决这个问题没有成功,尝试就在这里)

c++ temporary expression-templates ublas c++11

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

Haskell"图书馆"

在C中,可以将代码拆分为"头文件"和实现,编译实现,然后只分发编译版本和头文件(不是完整源代码).

这在Haskell有可能吗?

haskell compilation shared-libraries

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

boost :: variant实现

我只是对boost::variant实施感到好奇.

这样工作吗?

两名成员:

  1. 表示当前存储类型的数字(即第一个模板参数为0,第二个模板参数为1等)
  2. 所有可能类型的联合(当然最大的大小).

apply_visitor():

有一个switch关于代表当前存储类型的数字的语句来调用正确的重载(在最坏的情况下,这将被编译为跳转表,因此需要恒定的时间).

我知道还有一些优化可以肯定boost::variant不需要动态分配内存,详见此处,但我想我得到了这些.

c++ boost boost-variant

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

YAML中的字符串插值

在Perl中,我可以执行以下操作:

my $home = "/home";
my $alice = "$home/alice";
Run Code Online (Sandbox Code Playgroud)

我可以在YAML中执行以下操作:

Home: /home
Alice: $Home/alice
Run Code Online (Sandbox Code Playgroud)

那么"爱丽丝" /home/alice到底有效吗?

yaml string-interpolation template-variables

9
推荐指数
3
解决办法
2万
查看次数

将Monad表示法转换为箭头表示法

我试图理解箭头符号,特别是它如何与Monads一起工作.使用Monads,我可以定义以下内容:

f = (*2)
g = Just 5 >>= (return . f)
Run Code Online (Sandbox Code Playgroud)

并且gJust 10

我如何使用箭头符号进行上述操作?

monads haskell arrows

9
推荐指数
2
解决办法
618
查看次数

愚蠢的重复记录字段错误

考虑以下:

{-# LANGUAGE DuplicateRecordFields #-}

data A = A { name :: String }

data B = B { name :: String }

main = print $ name (A "Alice")
Run Code Online (Sandbox Code Playgroud)

编译时,我得到以下消息(在GHC 8.0.2上)

duplicatedrecords.hs:7:16: error:
    Ambiguous occurrence ‘name’
    It could refer to either the field ‘name’,
                             defined at duplicatedrecords.hs:5:14
                          or the field ‘name’, defined at duplicatedrecords.hs:3:14
Run Code Online (Sandbox Code Playgroud)

但如果我main按如下方式修改该行:

main = print $ name ((A "Alice") :: A)
Run Code Online (Sandbox Code Playgroud)

编译成功完成.

为什么是这样?类型签名:: A对我来说似乎是多余的,因为A构造函数肯定会使(A "Alice")类型的编译器清楚A.但由于某种原因,它会产生影响.为什么这样,有没有一种方法可以让我编译而不会乱丢额外的类型签名?

注意: …

haskell

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

善良的多态元组

我注意到PolyKinds并且DataKinds以下编译很好:

data Pair a b
data Test = Test
type Test2 = Pair 'Test 'Test
Run Code Online (Sandbox Code Playgroud)

然而:

type Test3 = ('Test, 'Test)
Run Code Online (Sandbox Code Playgroud)

失败,大概(,)是不是多态的,这是有道理的,因为它从它的类型参数中产生值,你不能创建不合适的类型的值*.

是否有一个具有类型多态元组的库(为了节省我重新发明轮子)?

我确实意识到,与真正的元组不同,类型多态元组只存在于类型级别,但这就是我需要的所有目的.

haskell

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

实例中默认方法的结果何时被缓存?

考虑以下模块:

{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DefaultSignatures #-}

module Lib where

import Data.List (foldl')

doBigSum :: (Enum a, Num a) => a
doBigSum = foldl' (+) 0 [1..200000000]

f :: (Enum a, Num a) => a -> a
f x = x + doBigSum

class BigSum a where
  bigSum :: a
  default bigSum :: (Enum a, Num a) => a
  bigSum = doBigSum

newtype A = A Integer deriving newtype (Enum, Num, Show)
newtype B …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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