小编Cli*_*ton的帖子

内射型族和约束

让我们说我们有一些现有的类或约束C,以及以下内容:

{-# TypeFamilyDependencies #-}

type family F t = s | s -> t

type D s = (s ~ T t, C t)
Run Code Online (Sandbox Code Playgroud)

当然type D s ...由于未知变量t而无法编译,但我怎么能写出类似的东西D s呢?我基本上想写:

type D s = (C (T_Inverse s))
Run Code Online (Sandbox Code Playgroud)

我认为这应该是有效的,因为T_Inverse存在注入性.我只是不知道如何表达它.

haskell type-families

4
推荐指数
1
解决办法
128
查看次数

编写涉及Rank-n类型的重写规则

下面是我面临的非常类似问题的简化版本。

考虑以下类型和函数f1

{-# LANGUAGE RankNTypes #-}

newtype D t = D t deriving Functor
newtype T t = T { getT :: t }

f1 :: (forall t'. t' -> D t') -> T t -> D (T t)
Run Code Online (Sandbox Code Playgroud)

注意f1实际上可以是id,因为如果我们通过了对所有功能都有效的函数,t我们当然可以将其专门化,如下所示:

f1 = id
Run Code Online (Sandbox Code Playgroud)

现在让我们考虑“逆”函数f2

f2 :: (T t -> D (T t)) -> t -> D t
Run Code Online (Sandbox Code Playgroud)

该功能“非专业化”,可以按以下方式实现:

f2 f x = getT <$> (f (T x))
Run Code Online (Sandbox Code Playgroud)

我们可以结合f2和 …

haskell ghc

4
推荐指数
1
解决办法
83
查看次数

特征是否可以具有由泛型参数化的超级特征?

你能在 Rust 中做这样的事情吗?

trait A : forall<T> B<T> { ... }
Run Code Online (Sandbox Code Playgroud)

也就是说,如果我们想要:

impl A for D { ... }
Run Code Online (Sandbox Code Playgroud)

我们首先要落实:

impl<T> B<T> for D { ... }
Run Code Online (Sandbox Code Playgroud)

types higher-kinded-types rust

4
推荐指数
1
解决办法
603
查看次数

为什么 `MonadError` 有函数依赖?

看来这可能有用:

data Err1 = Err1
data Err2 = Err2

f :: (MonadError Err1 m) => m Int
f = _

g :: (MonadError Err2 m) => m Char
g = _ 

h :: (MonadError Err1 m, MonadError Err2 m) => m (Int, Char)
h = (,) <$> f <*> g
Run Code Online (Sandbox Code Playgroud)

虽然上面的编译h是不可用的,因为一旦尝试为MonadError相同的对象定义两个实例m,该类的功能依赖性MonadError将导致错误。

我问的问题是为什么MonadError有这种功能依赖性?它似乎降低了它的灵活性,所以我认为有一些好处?能否给出一个代码示例,MonadError如果删除函数依赖性,使用哪种代码会更糟/不起作用?有些事情让我觉得我错过了一些关于如何MonadError使用的东西,因为函数依赖似乎妨碍了。

monads haskell

4
推荐指数
1
解决办法
122
查看次数

GHC 中“构造函数头”的用途是什么?

此页面位于: https: //gitlab.haskell.org/ghc/ghc/-/wikis/commentary/rts/storage/heap-objects建议 GHC 中的每个对象都有一个标头。

所以可以说我有:

data X = X1 Int# | X2 Int# Int#
Run Code Online (Sandbox Code Playgroud)

我的理解是,X在 的情况下有效地添加到数据类型需要三个单词X1,在 的情况下需要四个单词X2(假设对其进行评估)。X1一个用于指向or 的指针X2(将用它是什么进行标记)、X1or的标头X2,然后是一个或两个单词。

标题的目的是什么?据我了解,Haskell 在运行时擦除所有类型,并且不进行运行时反射(除非选择诸如 之类的东西Typeable)。

如果一个函数是多态的,比如说f :: a -> a,那么除了复制它之外,f实际上不能做任何事情。a它实际上不能检查a,所以如果它需要复制它,它应该只能复制指向它的指针。

现在,如果我们有了g :: Num a => a -> a,那么我们就有了一个类型类字典,它在编译时知道 的布局a。例如,如果我们这样做g (42 :: Int),那么我们知道在编译时创建一个Num Int字典并将其传递给gwith 42 :: Int。该Num …

haskell ghc

4
推荐指数
1
解决办法
119
查看次数

是否有一个模拟“补丁”的类?

我正在 Haskell 库中寻找如下所示的类(或者至少知道此类事物的数学名称):

class Monoid patch => MyThing patch t where
  applyPatch :: t -> patch -> t
Run Code Online (Sandbox Code Playgroud)

我可以有这样的实例:

instance MyThing (Last t) t where
  applyPatch x patch = case getLast patch of
    Just y => y
    Nothing => x
Run Code Online (Sandbox Code Playgroud)

但我也可以有这样的实例:

instance MyThing (Dual (Map key value)) (Map key value) where
  applyPatch x patch = ...
Run Code Online (Sandbox Code Playgroud)

补丁本质上是添加和/或替换映射中的键/值对。

如果你想删除,可以更进一步:

instance MyThing (Dual (Map key (Maybe value))) (Map key value) where
  applyPatch x patch = ...
Run Code Online (Sandbox Code Playgroud)

除了patch成为幺半群之外,我希望此类遵循的主要法则是结合性,具体来说:

forall (x :: …
Run Code Online (Sandbox Code Playgroud)

haskell discrete-mathematics monoids semigroup

4
推荐指数
1
解决办法
101
查看次数

变体宏

有没有办法写这样的宏:

#define G(x1, x2, ... , xn) f(x1), f(x2), ... , f(xn)
Run Code Online (Sandbox Code Playgroud)

或者我需要为每个人定义这个n吗?

C++ 0x答案还可以.

编辑:我问的是如何创建这个表单的宏,而不是一般采用可变数量的参数的宏.

目标:所以我可以做以下事情:

#define MAKE_TUPLE(x1, x2, ... , xn) mytuple<decltype((x1)), decltype((x2)), ... , decltype((xn))>{x1, x2, ... , xn}
Run Code Online (Sandbox Code Playgroud)

因此,这mytuple可以在没有移动和复制的情况下创建,也可以使用聚合构造在临时创建的临时工具中进行不必要的引用.

c++ macros c-preprocessor variadic-macros c++11

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

为什么这段代码可以删除副本?

可能重复:
构造函数调用机制
为什么使用空的括号集来调用不带参数的构造函数是错误的?

为什么这段代码可以删除A的所有副本?

#include <iostream>

class A
{
public:
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
};

class B
{
public:
  B(const A& a_) : a(a_) {}
private:
  A a;
};

int main()
{
  B b(A());
}
Run Code Online (Sandbox Code Playgroud)

这段代码显然没有复制A,并且在ideone的gcc 3.4下没有输出任何内容.

c++ most-vexing-parse

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

C++ 11:防止将对象分配给引用

有没有办法创建一个类型A:

鉴于:

A f(...);

然后:

双方auto&& a = f(...);const auto& a = f(...);给出一个编译错误?

这样做的原因是,在这种情况下,A是一个表达式模板,其中包含对temporaries(作为参数提供f)的引用,因此我不希望此对象的生命周期超出当前表达式.

注意我可以auto a = f(...);通过将As复制构造函数设为私有来防止成为问题,并f(...)在需要时成为A的朋友.

代码示例 (ideone链接):

#include <iostream>
#include <array>

template <class T, std::size_t N>
class AddMathVectors;

template <class T, std::size_t N>
class MathVector
{
public:
  MathVector() {}
  MathVector(const MathVector& x) 
  { 
    std::cout << "Copying" << std::endl;
    for (std::size_t i = 0; i != N; ++i)
    {
      data[i] = …
Run Code Online (Sandbox Code Playgroud)

c++ expression-templates c++11

3
推荐指数
1
解决办法
223
查看次数

哈斯克尔:Yesod和州

我正在阅读Toy URL Shortener的代码.然而,有一些重要的部分我无法理解.

它具有以下代码:

data URLShort = URLShort { state :: AcidState URLStore }
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我在自己的应用程序中写了这样的东西:

data MyApp = MyApp { state :: Int }
Run Code Online (Sandbox Code Playgroud)

然后我可以通过改变来编译

main = warpDebug 3000 MyApp
Run Code Online (Sandbox Code Playgroud)

main = warpDebug 3000 (MyApp 42)
Run Code Online (Sandbox Code Playgroud)

然后,我可以通过执行操作来读取处理程序中的状态

mystate <- fmap state getYesod 
Run Code Online (Sandbox Code Playgroud)

受到acid <- fmap state getYesod文章的启发.但是,我不知道怎么写.

我也尝试过:

data MyApp = MyApp { state :: State Int Int }
Run Code Online (Sandbox Code Playgroud)

但我对此并没有做多少.

我试图AcidState通过做一些简单的类似例子来弄清楚它是如何工作的,并且认为既然AcidState将所有内容保存在内存中,我应该能够做同样的事情吗?

对这里发生的事情的任何形式的一般性解释,以及也许我如何忽略这一点都将非常感激.

state haskell acid yesod

3
推荐指数
1
解决办法
889
查看次数