给定了一些类型类约束:
{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses #-}
import Data.Array.Unboxed(Ix,IArray,UArray)
type IntLike a = (Ord a, Num a, Enum a, Show a, Ix a, IArray UArray a)
Run Code Online (Sandbox Code Playgroud)
我怎样才能找出哪些类型的满足IntLike,即所有上述约束联合?
我可以把ghci :info命令输出所需的信息拼凑起来,然后通过调用(或者使用ghci typecheck)来重复检查我的工作
isIntLike :: IntLike -> Bool
isIntLike = const True
Run Code Online (Sandbox Code Playgroud)
在各种类型,例如isIntLike (3::Int).
有没有办法让ghci为我这样做?
我目前对具体类型感兴趣,但是不介意有一个更通用的解决方案,它也可以通过统一的上下文来实现聪明的东西!
在回答有关使用GADT的建议的问题时,评论中提出了一些与性能有关的问题.问题涉及类型类PlotValue:
class PlotValue a where
value :: a -> Double
Run Code Online (Sandbox Code Playgroud)
我的回答建议使用GADT Input:
data Input where
Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input
Run Code Online (Sandbox Code Playgroud)
但我认为细节并不重要.
我想知道性能的两个方面:
时间:模式匹配是否会产生任何运行时成本
case x of
Input (Just a) (Just b) -> value a * value b
_ -> 0.0
Run Code Online (Sandbox Code Playgroud)
超过正常成本匹配两个Maybe值?
空间:类型值Input携带多少存储开销?我的猜测是它PlotValue为每个类型的值Input(每个都有一个'指针')带有两个字典,这意味着[Input]在内存使用方面,a比使用更低效,(Just Double, Just Double)或者更好的是,(# #Double, #Double #)- 如果你存储结果value …
假设我有一个函数可以进行一些计算,有几种模式; 以模式匹配的形式实现.
大多数这些模式(以及其他不同的东西)对参数进行处理,我在let表达式中使用中间变量.但我发现let在许多模式上使用相同的方法确实是多余的,我想知道是否有一种方法可以let为多种模式定义?
这是我复制的一个例子let:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in …Run Code Online (Sandbox Code Playgroud) 假设我有以下代码:
{-# LANGUAGE GADTs, DeriveDataTypeable, StandaloneDeriving #-}
import Data.Typeable
class Eq t => OnlyEq t
class (Eq t, Typeable t) => BothEqAndTypeable t
data Wrapper a where
Wrap :: BothEqAndTypeable a => a -> Wrapper a
deriving instance Eq (Wrapper a)
deriving instance Typeable1 Wrapper
Run Code Online (Sandbox Code Playgroud)
然后,以下实例声明工作,没有约束t:
instance OnlyEq (Wrapper t)
Run Code Online (Sandbox Code Playgroud)
并做我期望它做的事情.
但是以下实例声明不起作用:
instance BothEqAndTypeable (Wrapper t)
Run Code Online (Sandbox Code Playgroud)
自GHC - 我使用7.6.1 - 抱怨说:
No instance for (Typeable t)
arising from the superclasses of an instance declaration
Possible fix: …Run Code Online (Sandbox Code Playgroud) 在read-compile-run管道的各个阶段,type声明和newtype声明之间有什么区别?
我的假设是他们编译成相同的机器指令,唯一的区别是当程序被类型检查时,例如
type Name = String
newtype Name_ = N String
Run Code Online (Sandbox Code Playgroud)
您可以使用Name在任何地方一个String是必需的,但如果你使用的typechecker会打电话给你了Name_,其中一个String是预期的,即使它们编码相同的信息.
我问这个问题是因为,如果是这种情况,我认为没有任何理由说明以下声明不应该有效:
type List a = Either () (a, List a)
newtype List_ a = L (Either () (a, List_ a))
Run Code Online (Sandbox Code Playgroud)
但是,类型检查器接受第二个但拒绝第一个.这是为什么?
我刚开始使用模板Haskell(我终于得到了一个用例,是的!)现在我认知卡住了.
我正在尝试做的是生成表单的单例数据类型声明
data $V = $V deriving (Eq,Ord)
Run Code Online (Sandbox Code Playgroud)
从名称V开始(希望以大写字符开头!).为了明确,我正在尝试编写一个declareSingleton类型的函数String -> DecsQ(我应该在这里提到我使用GHC 7.6.1,模板 - haskell版本2.8.0.0),这样拼接
$(declareSingleton "Foo")
Run Code Online (Sandbox Code Playgroud)
相当于
data Foo = Foo deriving (Eq,Ord)
Run Code Online (Sandbox Code Playgroud)
我有以下代码工作并做我想要的,但我对它不满意:
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in sequence [
dataD (cxt []) n [] [normalC n []] [''Eq,''Ord]
]
Run Code Online (Sandbox Code Playgroud)
我希望得到类似以下的东西:
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in
[d| data $n = $n deriving (Eq,Ord) …Run Code Online (Sandbox Code Playgroud) 我正在使用Jenkins启动Sonar-runner来分析项目.
现在我使用Build Breaker插件.当质量门报告质量低于/高于给定值时,这会打破构建.
我想在Jenkins的每个工作岗位上更改Sonar-Runner使用的质量门.查看Analysis Parameters文档:
**sonar.profile** parameter is to change the language to analyse
Run Code Online (Sandbox Code Playgroud)
我认为对于门:sonar.gate会工作(它没有)
题:
什么参数的声纳 - 跑步者必须用来改变"质量门"?
二手版本:
给出Haskell中的扁平列表:
['a', 'b','c','d']
Run Code Online (Sandbox Code Playgroud)
如何将其更改为:
[['a'], ['b'], ['c'], ['d']]
Run Code Online (Sandbox Code Playgroud) 比方说我有这样的列表
list = ["AC", "BA"]
Run Code Online (Sandbox Code Playgroud)
我想将此列表的每个唯一组合添加到元组,因此结果如下:
[("AC", "AC"),("AC","BA"),("BA", "BA")]
Run Code Online (Sandbox Code Playgroud)
哪里("BA","AC")被排除在外.
我的第一种方法是使用这样的列表理解:
ya = [(x,y) | x <- list, y <- list]
Run Code Online (Sandbox Code Playgroud)
但我无法让它工作,无论如何通过使用列表推导来实现我的结果?