标签: generic-programming

要组织的Linq表达式(有点像分组但不同)

假设我有一个相当大的IList<foo>地方,foo看起来像这样:

public class foo
{
    public string Region { get; set; }
    public string Territory { get; set; }
    public string Location { get; set; }
    public string Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

...是否有一种方法,使用一个相当快速/有效的表达式来"分组"这些foo项目Region,所以我可能最终得到一个IDictionary<string, IList<foo>>并且将string密钥作为Region属性,每个下属IList<foo>只包含与之foo匹配的记录区域?(它不一定是一个IDictionary,只是为了说明我正在尝试做的事情的要点.)我想以这种方式组织我的MVC视图的交互式列表,而不必编写相对复杂的东西或使用第三方库.

c# linq collections generic-programming

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

泛型参数的模板或函数重载

我有一个函数,它有三个参数

void replace(const string, const string, string*) ;
Run Code Online (Sandbox Code Playgroud)

我的问题是我要重写的第二个参数,所以它可以是字符串或Path对象(来自Boost Filesystem库,但实际上任何可以被视为字符串的对象都应该这样做)所以我不这样做必须将路径转换为遍布整个地方的字符串.

我知道我可以重载函数并进行两个实现,这就是我现在所做的,所以我有两个相同函数的实现:

void replace(const string, const string, string*) ;
void replace(const string, const path, string*) ;
Run Code Online (Sandbox Code Playgroud)

但这似乎并不优雅,即使第二个只是将路径转换为字符串并调用第一个(因此没有多少代码重复).我尝试过使用模板,如下所示:

template <class T>
void replace(const string, const T, string*) ;
Run Code Online (Sandbox Code Playgroud)

但是函数的实现要求它是一个字符串,所以如果给它一个路径,它需要转换为函数中的一个字符串,我不知道该怎么做,或者它是否是一件好事.

为了使问题更加复杂,将来我可能想要扩展函数,因此它也可以采用一组字符串或一组路径,而不是仅使用一个字符串/路径作为第二个参数.

处理这一切的最佳方法是什么?没有比拥有同一功能的多个实现更好的方法吗?

c++ templates generic-programming

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

如何将箭头用于多个元组?

foo (a1,a2) (b1,b2) (c1,c2) = (bar a1 b1 c1, bar2 a2 b2 c2)
Run Code Online (Sandbox Code Playgroud)

我有很多具有不同数量的参数元组的构造.如果是

foo' (a1,a2) = (bar' a1, bar2' a2)
Run Code Online (Sandbox Code Playgroud)

我想"嘿,那是箭头!":

foo' = bar' *** bar2'
Run Code Online (Sandbox Code Playgroud)

但我还不知道具有多个输入元组的函数(如第一个代码行中)是否以及如何映射到箭头样式.什么是处理这些功能的通用方法?理想情况下,我总是想要这样的东西foo = bar ... bar2.

haskell tuples arrows generic-programming

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

Scala中的通用编程

大家好我对来自C#的Scala相当新.

我正在尝试编写自己的累积版本(折叠)我想知道为什么我遇到以下问题:

def accumulate[T](list : List[T], initial: T, f: (T, T) => T) : T = {
    @tailrec def loop[T](list: List[T], accum: T) : T =
      if(list.length == 0)
        accum
      else{
        val head : T = list.head
        val res : T = f(accum,head)
        loop[T](list.tail, res)
      }
    loop(list,initial)
  }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

type mismatch;
 found   : accum.type (with underlying type T)
 required: T
        val res : T = f(accum,head)
                        ^
Run Code Online (Sandbox Code Playgroud)

考虑到一切都是T型,我无法看到我的类型不匹配.

任何想法/帮助将不胜感激.

布莱尔

generics scala generic-programming

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

通用类型集合

在之前的问题得到解决的基础上,但它导致了另一个问题.如果协议/类类型存储在集合中,则检索并实例化它们会引发错误.一个假设的例子如下.范例基于"程序到接口而非实现""编程到接口" 是什么意思?

在运行时动态地从protocol.Type引用实例化

public protocol ISpeakable {
    init()
    func speak()
}

class Cat : ISpeakable {
    required init() {}
    func speak() {
        println("Meow");
    }
}

class Dog : ISpeakable {
    required init() {}
    func speak() {
        println("Woof");
    }
}

//Test class is not aware of the specific implementations of ISpeakable at compile time
class Test {
    func instantiateAndCallSpeak<T: ISpeakable>(Animal:T.Type) {
        let animal = Animal()
        animal.speak()
    }
}

// Users of the Test class are aware of the specific implementations at …
Run Code Online (Sandbox Code Playgroud)

generic-programming generic-collections swift

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

有没有办法从这两个函数中的任何一个创建泛型函数?(通用数组到字符串)

我有以下两个函数,有什么方法可以使它们通用,以便它们接受任何数组,然后将其转换为字符串?

public static string PointArrayToString(Point[] array) => string.Join(" ", array);
public static string PointArrayToString(string[,] array) => string.Join(" ", array);
Run Code Online (Sandbox Code Playgroud)

例如...

    public static string PointArrayToString(T[] array) => string.Join(" ", array);
Run Code Online (Sandbox Code Playgroud)

c# linq generic-programming

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

Scala:隐式类的多个类型参数

我正在尝试将数据类型通用编程的Haskell库的一部分移植到Scala.这是我遇到的问题:

我已经Generic使用一些容器类型参数定义了一个特征:

trait Generic[G[_]] {
     // Some function declarations go here
 }
Run Code Online (Sandbox Code Playgroud)

现在我有一个抽象类,Collect有三个类型参数和一个函数声明(它表示一种类型,而不是可以从类型结构中将所有类型的子类收集B到一个类型的容器中):F[_]A

abstract class Collect[F[_],B,A] {
  def collect_ : A => F[B]
}
Run Code Online (Sandbox Code Playgroud)

为了使其延伸通用,前两个类型参数F[_]B给出,并且A是咖喱(这种效果是使用类型lambda表达式模拟的):

class CollectC[F[_],B] extends Generic[({type C[A] = Collect[F,B,A]})#C] {
    // Function definitions go here
}
Run Code Online (Sandbox Code Playgroud)

问题是我需要最后一个类定义是隐式的,因为稍后在我的代码中我将需要能够编写像

class GUnit[G[_]](implicit gg: Generic[G]) {
    // Some definitions
}
Run Code Online (Sandbox Code Playgroud)

当我只是前面implicit的类定义时,我得到一个错误说implicit classes must accept exactly one primary constructor parameter.有谁遇到过类似的问题?有没有一种已知的解决方法?我目前没有看到如何在保持相同功能的同时重构代码,所以欢迎任何建议.提前致谢!

scala implicit generic-programming

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

为大型和类型编写Hashable实例

我有一个很大的类型

data Value
= VNull
| VDouble !Double
| VSci !Scientific
| VInt !Int
| VText !Text
| VTexts ![Text]
| VByteString !BS.ByteString
| VUTCTime !UTCTime
-- This goes on for quite a few more lines
Run Code Online (Sandbox Code Playgroud)

我需要一个Hashable实例用于此数据类型.我当然可以手动输入实例,但幸运的是有一个基于泛型的hashWithSalt的默认实现.

不幸的是 - 据我所知 - 这需要任何可以在Value类型中"打包"的类型才能拥有Hashable实例.那么,UTCTime没有.

所以看起来我可以在两个"次优"解决方案之间做出选择:

  1. 手动输入Hashable实例.
  2. 编写Hashable UTCTime的孤立实例

我认为应该有第三种"最佳"方式:只为值构造函数编写一个无法自动执行的实现,即执行以下操作:

instance Hashable Value where
    hashWithSalt (VUTCTime t) = ... -- custom implementation
    hashWithSalt _ = ... -- use the default implementation
Run Code Online (Sandbox Code Playgroud)

当然可以更普遍地提出问题:如何在某些值构造函数的情况下重用现有的实例实现,同时在特定情况下拥有自己的实现,而无需为每个值构造函数编写样板文件.

haskell types generic-programming

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

调用基函数时模板参数推导失败

以下C++代码会产生编译错误.

编译器(gcc 5.2.0)抱怨在第15行它找不到匹配函数来调用'Derived :: test_func()'; 但是如果test_func()从Base移到Derived,它编译时没有错误.

class Base {
   public:
   int test_func();
};

class Derived : public Base {
public:
template <typename T>
int test_func(T t); 
};

template <typename T>
int Derived::test_func(T t)  
{
 test_func(); // line 15
 return 0;
}

int Base::test_func()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果模板函数使用不同的名称(与模板函数名称不同)调用Base类中的其他函数,如下面的代码所示,它也可以编译.

class Base {
   public:
   int test_func_diff_name();
};

class Derived : public Base {
public:
template <typename T>
int test_func(T t); 
};

template <typename T>
int Derived::test_func(T t)  
{
 test_func_diff_name();
 return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates generic-programming argument-deduction

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

如何使用std :: conditional选择自由函数

我有一些来自C库的以下形式的免费函数对:

void dvecse(int, double, double *, int);
void svecse(int, float,  float *,  int);
Run Code Online (Sandbox Code Playgroud)

我想将它们包装在C ++中,这样我可以调用一个函数,例如vecse,然后让编译器找出要调用的两个函数。

我试图通过实现它std::enable_if,但是我不认为这是为了实现(打开/关闭语义而不是选择),并且由于重新声明,以下类似内容显然无法编译:

template <typename T>
std::enable_if<std::is_same<T, double>::value> vecse = dvecse;

template <typename T>
std::enable_if<std::is_same<T, float>::value> vecse = svecse;
Run Code Online (Sandbox Code Playgroud)

此外,我尝试std::conditional了似乎仅适用于类型而不适用于自由函数的方法(带有函子的设计将是一种替代方案,但我会将所有自由函数包装在函数对象中)。

在编译时实现功能选择的简洁方法是什么?

c++ templates generic-programming

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