假设我们有一个带有签名的函数
foo :: a -> b -> Int
是否有可能实施一个约束来确保a和b是不同的?那就是
foo :: Int -> String -> Int -- ok
foo :: Int -> Int -> Int -- not ok
这个问题的目的是了解更多关于Haskell的信息,并可能解决我面临的一个设计问题。如果a==b,我的特殊情况是没有意义的,所以我想在编译器级别禁止这样做。我可能会用一个完全不同的设计来解决这个问题,但这不仅仅是现在的重点--潘多拉盒子已经打开,我想知道类型级别上的等式约束是否可能。
这是阿图尔版本的一个即兴片段。它使用为trivial-constraints
包开发的机制。
{-# LANGUAGE DataKinds, KindSignatures, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables, ExplicitNamespaces, TypeOperators, UndecidableSuperClasses, UndecidableInstances #-}
import Data.Type.Equality (type (==))
import GHC.TypeLits
import GHC.Exts (Any)
-- The Any constraint prevents malicious/ignorant
-- instantiation with no = undefined. The only
-- way to produce an instance of this class is in a local context
-- using something deeply unsafe like unsafeCoerce, magicDict, or unsafePerformIO.
class Any => Bottom where
no :: a
-- Why not just put the `no` method in this class?
-- Because then `no` will need to be applied to the type argument `e`, which is
-- very annoying and unnecessary.
class (TypeError e, Bottom) => Oops e
class Foo a b (eq :: Bool) where
foo' :: a -> b -> Int
foo :: forall a b. Foo a b (a == b) => a -> b -> Int
foo = foo' @a @b @(a == b)
instance Oops ('Text "NAUGHTY!") => Foo a b 'True where
foo' = no
instance Foo a b 'False where
foo' _ _ = 42
为了Android的开发,我从Java切换到kotlin。当我在Kotlin中搜索Java静态方法的等价时,我发现同伴对象是。但问题是在Kotlin中创建多个静态方法时。我得到了这些错误,每个类只允许一个伴随对象。
问题内容: 我有一个组件和一个组件,当有不是组件的子代时,我想抛出一个错误。这可能吗,还是我想解决错误的问题? 问题答案: 您可以为每个孩子使用displayName,可通过以下类型进行访问:
在StackOverflow中我知道很多类似的问题,但没有什么能解决我的问题。 IDE显示错误:只允许类位于类文字的左手边 对此如何解决?提前道谢。
问题内容: 我正在创建一个页面,供用户上传文件。如果文件类型是其他jpg,gif和pdf,我希望使用if语句创建$ error变量。 这是我的代码: 我在构造if语句时遇到困难。我怎么说呢 问题答案: 将允许的类型放入数组并使用。
问题内容: 我想知道为什么允许它具有不同类型的对象引用?例如; 您能否举一个使用不同类型的对象引用有用的示例? 编辑: 问题答案: 这是多态性和抽象的核心。例如,这意味着我可以写: …并处理 任何 类型的输入流,无论是来自文件,网络,内存中的输入流。还是同样地,如果您有一个,则可以不考虑其实现而要求其元素0。 将子类的实例视为超类的实例的能力称为Liskov的替代原理。它允许松散耦合和代码重用。
我有一个包裹 现在我想禁止在之外的实现,但是应该是公共的,因为我将其用于。 如何做到这一点? 这有什么“套餐最终模式”吗? 你有过这样的情况吗? 详情: 我知道有可能只使用带有包私有构造函数的抽象类,而不是接口,但是和扩展不同的类,因此我需要多重继承(因为模拟多重继承(例如,见有效的Java项目18)在这里不起作用)。