我正在学习Haskell,并试图掌握Haskell类型系统究竟是如何工作的,重新确定事物的类型:动态,静态,手动设置,推断?
语言我知道一点:
C,Java:由程序员手动设置,在编译时验证,如int i;强类型(从字符串中减去整数是编译错误).典型的静态类型系统.
Python:运行时自动推断的类型(动态类型),强类型(int从str引发异常中减去).
Perl,PHP:在运行时自动推断类型(动态类型),弱类型.
Haskell:类型通常在编译时自动推断(在编译时,程序员明确设置此类型或类型),强类型.
Haskell的类型系统真的值得描述"静态"吗?我的意思是自动类型推断不是(经典的)静态类型.
我遇到了一个我无法理解的非常奇怪的行为.我有一个Texture类型contentWidth属性的类int.此类包含在Image具有width类型属性的类中int.所述width的Image计算简单地作为contentWidth底层质地:
- (int) width
{
return texture.contentWidth;
}
Run Code Online (Sandbox Code Playgroud)
现在Image由Button想要读取图像大小的类(通过合成,而不是继承)使用:
// image is of type ‘id’
int width = [image width];
int height = [image height];
Run Code Online (Sandbox Code Playgroud)
问题是height变量设置得很好,而width变量包含NaN(-2147483648).我检查了尺寸 - 它们大约是200×100左右,没有接近int极限.此外,Xcode调试器工具提示Texture正确显示两个属性,只有在宽度通过两个访问器后,数字才会出现乱码.对象未释放.我错过了什么?
更新:我已经扩展了Image类中的访问器以查看问题的来源:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在第一行中断时,w获得正确设置.我跳过,执行返回到调用函数:
- …Run Code Online (Sandbox Code Playgroud) 正如标题所示,我想将可变数据类型传递给模板类.像这样的东西:
frmExample = New LookupForm(Of Models.MyClass) 'Works fine
Dim SelectedType As Type = InstanceOfMyClass.GetType() 'Works fine
frmExample = New LookupForm(Of SelectedType) 'Ba-bow!
frmExample = New LookupForm(Of InstanceOfMyClass.GetType()) 'Ba-bow!
Run Code Online (Sandbox Code Playgroud)
LookupForm<Models.MyClass> frmExample;
Type SelectedType = InstanceOfMyClass.GetType();
frmExample = new LookupForm<SelectedType.GetType()>(); //Ba-bow
frmExample = new LookupForm<(Type)SelectedType>(); //Ba-bow
Run Code Online (Sandbox Code Playgroud)
我假设它与在编译时处理的模板有关,但即使我在那里没有标记,它也无法解决我的问题.我找不到有关使用Reflection实例模板类的任何相关信息.
(如何)我可以在运行时创建动态类型存储库的实例吗?
是否可以在纯ANSI-C中复制通用数组?
我有这个结构,它包含一个数组(目前用于浮点数)和一些变量,如数组中的变异大小和容量.
typedef struct _CustomArray
{
float* array; //the array in which the objects will be stored
int size; //the current size of the array
int capacity; //the max capacity of the array
} CustomArray;
Run Code Online (Sandbox Code Playgroud)
我使用这个结构,所以我可以在纯C中创建一个数组,我可以在其中添加/删除项目,在需要时动态扩展数组大小等所有"标准"数组所做的事情,除了它只用C制作.现在我想这样做,这样当你初始化这个结构时,你可以设置它应该保存的元素的数据类型,此时它只能存储浮点数据类型,但我想使它能够存储任何数据类型/其他结构.但我不知道这是否可行.
此时制作此数组的函数是:
CustomArray* CustomArray_Create(int initCapacity, /*type elementType*/)
{
CustomArray* customArray_ptr; //create pointer to point at the structure
float* internalArray = (float*)malloc(sizeof(float) * initCapacity); //create the internal array that holds the items
if(internalArray != NULL)
{
CustomArray customArray = { internalArray, 0, initCapacity }; //make the …Run Code Online (Sandbox Code Playgroud) 我需要将返回值强制转换为我需要保持动态的特定类型,例如
let cellType = "CellTypeToBeResolved"
cell = (tableView.dequeueReusableCellWithIdentifier("myID") as? CellTypeToBeResolved)!
Run Code Online (Sandbox Code Playgroud)
这怎么可能在Swift 2.0中?日Thnx!
我有
data D t = ...
data SomeStuff = forall a (Typeable a, ...) => SomeStuff a
Run Code Online (Sandbox Code Playgroud)
在某些时候,我得到了一个 SomeStuff,a我想尝试将其内部转换为D t(任何类型t都可以,我只对这部分感兴趣)。一些(在伪 Haskell 中)看起来像:D
case someStuff of
SomeStuff (_ :: a) -> case eqT :: Maybe (a :~: (exists t. D t)) of
Just Refl -> -- proven that `exists t. a ~ D t`
Nothing -> -- nothing to do here
Run Code Online (Sandbox Code Playgroud)
我一直在摆弄Data.Type.Equality和Type.Reflection(如应用程序等),但我无法让它工作。任何人都有办法做到这一点?
我正在从Linq-to-SQL切换到Linq-to-Entities并且在转换过程中遇到错误"LINQ to Entities无法识别方法'System.String Format(System.String,System.Object ,System.Object)'方法,并且此方法无法转换为商店表达式".以下代码是罪魁祸首.我知道这必须使用我在下面使用的动态类型生成.我怎样才能使用动态类型并使用L2E?
var query = _db.Persons.Where(p => p.PersonId == PersonId);
if (query.Count() > 0)
{
var data = query.Join(_db.Users, p => p.UserId, u => u.UserId, (p, u) => new
{
Id = p.PersonId,
Name = string.Format("{0} {1}", p.FirstName, p.LastName),
Phone = p.Phone,
Email = u.Email
}).Single();
return data;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
好的,在@John Hartsock向我展示简单的解决方案之后感觉有点愚蠢...
如果我想做一些更复杂的字符串操作怎么办?
例如,假设我们有以下数据结构:
data Foo = Bool Bool | Int Int | Double Double
Run Code Online (Sandbox Code Playgroud)
现在,有更简单的方法来做到这一点:
foo :: Typeable a => a -> Foo
foo x = maybe (error "i dunno") id $
liftM Bool (cast x) `mplus`
liftM Int (cast x) `mplus`
liftM Double (cast x)
Run Code Online (Sandbox Code Playgroud)
有人想过为Typeable类型制作模式匹配的语法吗?
如果有人提出这个问题但我无法在任何地方找到答案.
我的问题是在使用MOQ模拟返回方法时,该方法返回动态类型.我正在使用第三部分库,它使用动态时间.MOQ似乎将动态类型转换为对象.
Mock<IFacebookHelper> mockFbHelp = new Mock<IFacebookHelper>();
mockFbHelp.Setup(x => x.Get("me")).Returns(new { email = "test@test.com", id="9999" });
Run Code Online (Sandbox Code Playgroud)
模拟帮助器中的方法.
public dynamic Get(string p)
{
var client = new FacebookClient(AccessToken);
return client.Get("me");
}
Run Code Online (Sandbox Code Playgroud)
来自控制器的代码使用模拟结果.
_facebookHelper.AccessToken = accessToken;
dynamic result = _facebookHelper.Get("me");
int facebookId = int.Parse(result.id); //This errors as id doesn't exist.
Run Code Online (Sandbox Code Playgroud)
基本上,MOQ返回了一个动态类型的对象,需要将其作为某种东西进行渲染.
有谁知道如何解决这个问题?我假设它可能是因为MOQ没有在.NET 4中编码因此不支持动态类型?
编辑
实际上我不认为这是一个MOQ问题,因为我创建了自己的模拟类,但仍然遇到了同样的问题.我是动态类型的新手,但不知道发生了什么.
编辑2 - 部分回答..问题毕竟与MOQ无关
实际上问题似乎是由于在不同的程序集中创建了动态类型.虽然我使用JObject类型解决了我最初的问题,但我还是想弄明白这一点.
namespace MyLib.Tools
{
public interface IDynTest
{
dynamic GetData();
}
}
Run Code Online (Sandbox Code Playgroud)
namespace MyLib.Tools
{
public class DynTest : Effect.Tools.IDynTest
{
public dynamic GetData() …Run Code Online (Sandbox Code Playgroud) 根据Word Interop文档,Microsoft.Office.Interop.Word.Application是一个接口,但我能够创建一个新的实例,如下所示
var application = new Microsoft.Office.Interop.Word.Application();
Run Code Online (Sandbox Code Playgroud)
在DotNetPerls上也有这样的例子.通常不可能在C#中创建接口的实例,那么这里怎么可能呢?这是COM或动态类型的功能吗?
dynamic-typing ×10
c# ×4
haskell ×3
generics ×2
arrays ×1
c ×1
casting ×1
com ×1
com-interop ×1
ios ×1
mocking ×1
moq ×1
objective-c ×1
reflection ×1
return ×1
swift2 ×1
syntax ×1
type-systems ×1
typeof ×1
types ×1
typing ×1
vb.net ×1