如果我使用错误的术语,请原谅我,我是haskell类型操作的初学者...我试图使用具有功能依赖性的重叠实例来对HLists进行一些类型级编程.
这里我的目标是尝试编写类型类HNoNils l l',这HNoNils l l'意味着,l作为列表类型(例如:) Int : String : EmptyNil : Int : HNil,l'是没有特定空类型的相应列表类型EmptyNil(示例的结果:) Int:String:Int:HNil:
{-# LANGUAGE ExistentialQuantification,
FunctionalDependencies,
FlexibleInstances,
UndecidableInstances,
OverlappingInstances,
TypeFamilies #-}
import Data.HList
import Data.TypeLevel.Bool
--Type Equality operators
--usedto check if a type is equal to another
class TtEq a b eq | a b -> eq
instance TtEq a a True
instance eq~False => TtEq a b eq
data EmptyNil = EmptyNil deriving …Run Code Online (Sandbox Code Playgroud) 是否有可能做类似的事情
class T a
class U a
instance U ()
instance ( NOT U a ) => T a
Run Code Online (Sandbox Code Playgroud)
上下文:我正在尝试编写一个函数,它接受HLists并删除某种类型的元素(这里是单元类型).
我觉得开放世界的假设可能存在一些问题,但即使能够以硬编码方式(而不是NOT U a,类似NOT~())这样做也应该是可能的.
编辑:正如CA McMann的评论所指出的,这个问题几乎与我的完全相同.如果主持人想要关闭这个,请随意.
现在我有一个相对简单的类设置:
class A{
//stuff
}
class B:A{
//more stuff
}
public List<A> ListOfObjects;
Run Code Online (Sandbox Code Playgroud)
如果我这样做会发生什么
foreach(B i in ListOfObjects)
Run Code Online (Sandbox Code Playgroud)
我只能得到B型物品吗?它会应用一些OO魔法并将所有As转换为Bs吗?这甚至会起作用吗?
想象一下,我有以下数据类型和类型类(具有适当的语言扩展):
data Zero=Zero
data Succ n = Succ n
class Countable t where
count :: t -> Int
instance Countable Zero where
count Zero = 0
instance (Countable n) => Countable (Succ n) where
count (Succ n) = 1 + count n
Run Code Online (Sandbox Code Playgroud)
是否有可能编写一个函数,从Integer中提供一个正确的类型类实例的实例?基本上,一个功能f,使得count (f n) = n
我的尝试是以下变体,这在编译时给了我一些类型错误:
f::(Countable k)=> Int -> k
f 0 = Zero
f n = Succ $ f (n-1)
Run Code Online (Sandbox Code Playgroud)
我在寻找解决方案的过程中经常讨论依赖类型,但我还没有能够将这些讨论映射到我的用例.
背景:因为我意识到这将会得到很多"你为什么要这样做"这类问题......
我目前正在使用该Data.HList包来处理异构列表.在这个库中,我想构建一个函数shuffle,当给定一个整数时n,它会将n列表的th元素移到最后.
例如,如果我有l=1:"Hello":32:500 …
我正在尝试使用django的queryset API来模拟以下查询:
SELECT EXTRACT(year FROM chosen_date) AS year,
EXTRACT(month FROM chosen_date) AS month,
date_paid IS NOT NULL as is_paid FROM
(SELECT (CASE WHEN date_due IS NULL THEN date_due ELSE date END) AS chosen_date,* FROM invoice_invoice) as t1;
Run Code Online (Sandbox Code Playgroud)
这个想法主要是在某些情况下,我宁愿在某些情况下使用date_due列而不是date列,但是,因为date_due是可选的,我有时必须使用date作为后备,并创建一个计算列chosen_date,而不必更改其余查询.
这是我在模仿这个时做的第一次尝试,我无法真正看到如何正确地使用基础api进行null测试,所以我选择了extra:
if(use_date_due):
sum_qs = sum_qs.extra(select={'chosen_date': 'CASE WHEN date_due IS NULL THEN date ELSE date_due END'})
else:
sum_qs = sum_qs.extra(select={'chosen_date':'date'})
sum_qs = sum_qs.extra(select={'year': 'EXTRACT(year FROM chosen_date)',
'month': 'EXTRACT(month FROM chosen_date)',
'is_paid':'date_paid …Run Code Online (Sandbox Code Playgroud) 可能重复:
Scala:返回布尔值的简短模式匹配形式
在我的scala代码中,我发现自己经常编写如下内容:
x match{
case Type(params) => doStuffWith(params)
case _ => /* do nothing*/
}
Run Code Online (Sandbox Code Playgroud)
是否已有一些预定义的运算符来执行此操作?我想如果我能写下这样的东西会更清楚:
if( x match Type(params)) {
doStuffWith(params)
}
Run Code Online (Sandbox Code Playgroud)
基本上避免了奇怪的情况.我还有其他情况可以验证某些东西是否与内联方式相匹配,这样可以省去额外的一对括号.
我知道在编写更多迭代代码时这种事情可能更有用,但Scala似乎有很多隐藏的功能,我想知道是否有人有一个简单的解决方案.
是否可以按如下方式实现类型类:
class SomeClass e where
isEq :: (SomeClass e') => e -> e' -> Bool
Run Code Online (Sandbox Code Playgroud)
isEq x y当x和y这两个类型的同一个实例时,哪里会返回true ?
上下文:这是获得运行时类型测试的一种薄薄的尝试.虽然起初我读过Haskell有类型擦除,但我也读过最近对GHC的扩展,那里有一些运行时信息.
编辑:对于那些想知道我的用例的人......我一直在使用类型级编程来确保某些ADT的某些属性,即涉及资源使用.这些资源由不同类型表示(因此资源锁在类型级别实现).
我正在尝试编写一个需要识别资源写入/读取的优化过程.但由于我的所有资源都由不同的单例表示,其唯一的共同因素(除了所有值都是底部)是将它们组合在一起的类型类.
简而言之,我想在运行时,值级别使用我的类型级编程的结果.
我正在尝试使Java applet在其封闭环境中通过javascript进行交互.
到目前为止,我一直在使用netscape.javascript.JSObjectJS作为处理Java函数调用的类型,但我刚刚发现它还有一个sun.plugin.javascript.JSObject,甚至一个sun.plugin.javascript.navig.JSObject!
我已经尝试了解更多关于这两个其他版本无济于事.我应该坚持下去netscape.javascript.JSObject吗?