我遇到的情况是,我有一个产品类型(例如),以及一个使用 deriving 派生的Tsay 实例,它可以工作,因为 的每个成员都是 的实例。CanyclassTC
我将 的一个成员更改T为不是 的实例的类型C(让我们调用这个新成员的类型U)。请注意, 和C都U来自外部库,T在我自己的代码中。这给我留下了一些选择,我想到了:
C T,这需要我深入研究通用实现并基本上复制粘贴它。C U(因为我不控制C也不U)。U(例如V U)并将成员更改为 type V。但我真的不喜欢这些解决方案:
T当通用派生实例运行良好时,我真的不想手动复制粘贴破解整个手动实例。{}样式语法打开类型一样,我仍然必须强制结果。所有这些黑客行为只是为了处理一个讨厌的实例。所以,我的想法是,我只需要在这个地方提供我的自定义实例,而不是我的整个程序。
所以我定义了 a newtype V = V U,并定义了我的实例C V。但我没有改变类型T。相反,我使用该库编写了以下函数,并结合了我从此处和此处constraints获得的一些想法:
import Data.Coerce (Coercible, …Run Code Online (Sandbox Code Playgroud) 据我所知,表达式模板将在C++ 11中基于范围而中断,因为for (auto x : expr)它具有隐含性auto&& __range = expr,这将导致悬空引用.
有没有办法创建表达式模板类,以便它们能够正确地使用基于范围的行为,或者至少抛出编译错误?
基本上,我想防止表达式模板正确编译但由于悬空引用而在运行时失败的可能性.我不介意在基于for的范围内使用表达式模板之前必须将表达式模板包装起来,只要在用户忘记包装表达式模板时没有静默运行时错误.
我理解做类似以下的事情:
auto&& x = Matrix1() + Matrix2() + Matrix3();
std::cout << x(2,3) << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果矩阵运算使用表达式模板(例如boost::ublas),将导致静默运行时错误.
是否有任何设计表达式模板的方法来防止编译器编译可能导致在运行时使用过期临时值的代码?
(我尝试解决这个问题没有成功,尝试就在这里)
在C中,可以将代码拆分为"头文件"和实现,编译实现,然后只分发编译版本和头文件(不是完整源代码).
这在Haskell有可能吗?
我只是对boost::variant实施感到好奇.
这样工作吗?
两名成员:
apply_visitor():
有一个switch关于代表当前存储类型的数字的语句来调用正确的重载(在最坏的情况下,这将被编译为跳转表,因此需要恒定的时间).
我知道还有一些优化可以肯定boost::variant不需要动态分配内存,详见此处,但我想我得到了这些.
在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到底有效吗?
我试图理解箭头符号,特别是它如何与Monads一起工作.使用Monads,我可以定义以下内容:
f = (*2)
g = Just 5 >>= (return . f)
Run Code Online (Sandbox Code Playgroud)
并且g是Just 10
我如何使用箭头符号进行上述操作?
考虑以下:
{-# 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.但由于某种原因,它会产生影响.为什么这样,有没有一种方法可以让我编译而不会乱丢额外的类型签名?
注意: …
我注意到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)
失败,大概(,)是不是多态的,这是有道理的,因为它从它的类型参数中产生值,你不能创建不合适的类型的值*.
是否有一个具有类型多态元组的库(为了节省我重新发明轮子)?
我确实意识到,与真正的元组不同,类型多态元组只存在于类型级别,但这就是我需要的所有目的.
考虑以下模块:
{-# 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)