小编yat*_*975的帖子

如何找出哪些(具体)类型满足一组类型类约束?

给定了一些类型类约束:

{-# 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为我这样做?

我目前对具体类型感兴趣,但是不介意有一个更通用的解决方案,它也可以通过统一的上下文来实现聪明的东西!

haskell typeclass ghci

10
推荐指数
1
解决办法
123
查看次数

使用GADT的性能影响

回答有关使用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 …

performance haskell gadt

9
推荐指数
1
解决办法
578
查看次数

Haskell是否允许let表达多个模式匹配?

假设我有一个函数可以进行一些计算,有几种模式; 以模式匹配的形式实现.

大多数这些模式(以及其他不同的东西)对参数进行处理,我在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)

haskell functional-programming pattern-matching let

7
推荐指数
1
解决办法
6304
查看次数

如何让GHC为上下文中具有Typeable的GADT生成Data.Typeable实例?

假设我有以下代码:

{-# 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)

haskell ghc derived-instances gadt

7
推荐指数
1
解决办法
901
查看次数

编译类型和newtype之间的时间和运行时间差异

在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 types

6
推荐指数
1
解决办法
233
查看次数

是否有一种很好的(r)方法来编写涉及单例数据类型的模板Haskell代码?

我刚开始使用模板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)

haskell template-haskell

6
推荐指数
1
解决办法
394
查看次数

变化:Jenkins的质量门(声纳 - 跑步者)

我正在使用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会工作(它没有)


题:

什么参数的声纳 - 跑步者必须用来改变"质量门"?

二手版本:

  • 詹金斯1.598
  • 声纳4.5.1(LTS)

jenkins sonarqube

6
推荐指数
1
解决办法
9752
查看次数

3
推荐指数
3
解决办法
1116
查看次数

Haskell为列表添加了列表的唯一组合

比方说我有这样的列表

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)

但我无法让它工作,无论如何通过使用列表推导来实现我的结果?

haskell list-comprehension list

0
推荐指数
2
解决办法
1127
查看次数