假设我有一个相当大的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视图的交互式列表,而不必编写相对复杂的东西或使用第三方库.
我有一个函数,它有三个参数
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)
但是函数的实现要求它是一个字符串,所以如果给它一个路径,它需要转换为函数中的一个字符串,我不知道该怎么做,或者它是否是一件好事.
为了使问题更加复杂,将来我可能想要扩展函数,因此它也可以采用一组字符串或一组路径,而不是仅使用一个字符串/路径作为第二个参数.
处理这一切的最佳方法是什么?没有比拥有同一功能的多个实现更好的方法吗?
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.
大家好我对来自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型,我无法看到我的类型不匹配.
任何想法/帮助将不胜感激.
布莱尔
在之前的问题得到解决的基础上,但它导致了另一个问题.如果协议/类类型存储在集合中,则检索并实例化它们会引发错误.一个假设的例子如下.范例基于"程序到接口而非实现""编程到接口" 是什么意思?
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) 我有以下两个函数,有什么方法可以使它们通用,以便它们接受任何数组,然后将其转换为字符串?
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) 我正在尝试将数据类型通用编程的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.有谁遇到过类似的问题?有没有一种已知的解决方法?我目前没有看到如何在保持相同功能的同时重构代码,所以欢迎任何建议.提前致谢!
我有一个很大的类型
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没有.
所以看起来我可以在两个"次优"解决方案之间做出选择:
我认为应该有第三种"最佳"方式:只为值构造函数编写一个无法自动执行的实现,即执行以下操作:
instance Hashable Value where
hashWithSalt (VUTCTime t) = ... -- custom implementation
hashWithSalt _ = ... -- use the default implementation
Run Code Online (Sandbox Code Playgroud)
当然可以更普遍地提出问题:如何在某些值构造函数的情况下重用现有的实例实现,同时在特定情况下拥有自己的实现,而无需为每个值构造函数编写样板文件.
以下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库的以下形式的免费函数对:
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了似乎仅适用于类型而不适用于自由函数的方法(带有函子的设计将是一种替代方案,但我会将所有自由函数包装在函数对象中)。
在编译时实现功能选择的简洁方法是什么?