小编cdk*_*cdk的帖子

什么是类型级编程的例子?

我不明白"类型级编程"的含义,也无法使用Google找到合适的解释.

有人可以提供一个演示类型级编程的示例吗?范式的解释和/或定义将是有用的和受到赞赏的.

haskell functional-programming scala type-level-computation

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

快速,无分支无符号int绝对差异

我有一个程序,它花费大部分时间来计算RGB值之间的欧几里德距离(无符号8位的3元组Word8).我需要一个快速,无分支的无符号int绝对差函数

unsigned_difference :: Word8 -> Word8 -> Word8
unsigned_difference a b = max a b - min a b
Run Code Online (Sandbox Code Playgroud)

特别是,

unsigned_difference a b == unsigned_difference b a

我使用GHC 7.8中的新初学者提出了以下内容:

-- (a < b) * (b - a) + (a > b) * (a - b)
unsigned_difference (I# a) (I# b) =
    I# ((a <# b) *# (b -# a) +# (a ># b) *# (a -# b))]
Run Code Online (Sandbox Code Playgroud)

ghc -O2 -S编译成

.Lc42U:
    movq 7(%rbx),%rax
    movq $ghczmprim_GHCziTypes_Izh_con_info,-8(%r12)
    movq …
Run Code Online (Sandbox Code Playgroud)

performance haskell bit-manipulation simd

20
推荐指数
1
解决办法
1364
查看次数

GHC生成冗余核心操作

我有以下程序将6位ASCII转换为二进制格式.

ascii2bin :: Char -> B.ByteString
ascii2bin = B.reverse . fst . B.unfoldrN 6 decomp . to6BitASCII -- replace to6BitASCII with ord if you want to compile this
    where decomp n = case quotRem n 2 of (q,r) -> Just (chr r,q)

bs2bin :: B.ByteString -> B.ByteString
bs2bin = B.concatMap ascii2bin
Run Code Online (Sandbox Code Playgroud)

这产生了以下核心部分:

Rec {
$wa
$wa =
  \ ww ww1 ww2 w ->
    case ww2 of wild {
      __DEFAULT ->
        let {
          wild2
          wild2 = remInt# ww1 2 } in …
Run Code Online (Sandbox Code Playgroud)

performance haskell core ghc

16
推荐指数
1
解决办法
382
查看次数

Data.Map中键/值关系的静态保证

我想为Data.Map创建一个特殊的智能构造函数,对键/值对关系的类型有一定的约束.这是我试图表达的约束:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DataKinds #-}

data Field = Speed | Name | ID
data Value = VFloat Float | VString ByteString | VInt Int

class Pair f b | f -> b where
    toPair :: f -> b -> (f, b)
    toPair = (,)

instance Pair Speed (VFloat f) 
instance Pair ID (VInt i)
Run Code Online (Sandbox Code Playgroud)

对于每个字段,只应该与其关联的一种类型的值.就我而言,一个Speed字段映射到一个字段是没有意义的ByteString.一个Speed字段应该唯一映射到一个Float

但是我收到以下类型错误:

Kind mis-match
The first argument of `Pair' should have kind `*',
but `VInt' has kind …
Run Code Online (Sandbox Code Playgroud)

haskell compile-time type-constraints functional-dependencies gadt

12
推荐指数
2
解决办法
547
查看次数

FreeT是否保留Free的等式推理优势?

在这篇博客文章中,作者解释了使用Free monad净化代码的等式推理优势.Free Monad变压器FreeT是否保留了这些优势,即使它包裹在IO之外?

haskell

11
推荐指数
1
解决办法
441
查看次数

Haskell parMap和并行

我实现了康威的生命游戏.我希望通过使用并行性来加速它.

life :: [(Int, Int)] -> [(Int, Int)]
life cells = map snd . filter rules . freq $ concatMap neighbours cells
    where rules (n, c) = n == 3 || (n == 2 && c `elem` cells)
          freq = map (length &&& head) . group . sort

parLife :: [(Int, Int)] -> [(Int, Int)]
parLife cells = parMap rseq snd . filter rules . freq . concat $ parMap rseq neighbours cells
    where rules (n, c) = n == …
Run Code Online (Sandbox Code Playgroud)

parallel-processing haskell conways-game-of-life

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

使用GHC.Generics派生默认实例

我有一个类型类Cyclic,我希望能够提供泛型实例.

class Cyclic g where
    gen :: g
    rot :: g -> g
    ord :: g -> Int
Run Code Online (Sandbox Code Playgroud)

给定一个类型的nullary构造函数,

data T3 = A | B | C deriving (Generic, Show)
Run Code Online (Sandbox Code Playgroud)

我想生成一个等效于此的实例:

instance Cyclic T3 where
    gen   = A
    rot A = B
    rot B = C
    rot C = A
    ord _ = 3
Run Code Online (Sandbox Code Playgroud)

我试图找出所需的Generic机器

{-# LANGUAGE DefaultSignatures, FlexibleContexts, ScopedTypeVariables, TypeOperators #-}

import GHC.Generics

class GCyclic f where
    ggen :: f a
    grot :: f a …
Run Code Online (Sandbox Code Playgroud)

haskell generic-programming scrap-your-boilerplate deriving

8
推荐指数
1
解决办法
807
查看次数

Java高阶多态函数

我非常熟悉Scheme和Haskell等功能语言.我正在努力解决Java中的问题而苦苦挣扎,可能是因为我仍处于功能性思维模式中.

我想写:

public void doQueryAndStoreData(String query, <? extends Collection> storeIn) {
    /* make a jdbc query, get ResultSet */
    ResultSet rset = ...;
    ProcessResultSet proc = new ProcessResultSet();
    proc.process(rset, storeIn);
    /* clean up */
}
Run Code Online (Sandbox Code Playgroud)

使用如下界面:

private interface IProcessResultSet<C> {
    public void process(ResultSet rset, C storeIn);
}
Run Code Online (Sandbox Code Playgroud)

和一个实现接口的类,如:

private class ProcessResultSet implements IProcessResultSet<? extends Collection> {
    public void process(ResultSet rset, Map storeIn) {
        /* do something */
    }

    public void process(ResultSet rset, List storeIn) {
        /* do something else */ …
Run Code Online (Sandbox Code Playgroud)

java polymorphism higher-order-functions

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

并行Haskell - GHC GC'ing火花

我有一个程序,我正在尝试并行化(这里完全粘贴可运行的代码).

我已经分析过并发现大部分时间花费在findNearest其中基本上是一个简单的foldr过大Data.Map.

findNearest :: RGB -> M.Map k RGB -> (k, Word32)
findNearest rgb m0 =
    M.foldrWithKey' minDistance (k0, distance rgb r0) m0
    where (k0, r0) = M.findMin m0
          minDistance k r x@(_, d1) =
            -- Euclidean distance in RGB-space
            let d0 = distance rgb r
            in if d0 < d1 then (k, d0) else x
Run Code Online (Sandbox Code Playgroud)

parFindNearest应该findNearest在较大的子树上并行执行Map.

parFindNearest :: NFData k => RGB -> M.Map k RGB …
Run Code Online (Sandbox Code Playgroud)

parallel-processing garbage-collection haskell

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

为列表创建新的Ord实例

这是我第一次尝试创建类的自定义实例,如Ord.

我已经定义了一个新的数据结构来表示一个列表:

data List a = Empty | Cons a (List a)
    deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

现在我想为List定义一个新的Ord实例,使得List a <= List b意味着"List a中元素的总和小于或等于List b中元素的总和"

首先,是否有必要定义一个新的"sum"函数,因为Prelude中定义的总和不适用于新的List数据类型?那么,我如何为列表定义Ord的新实例?

谢谢

haskell typeclass instances

5
推荐指数
1
解决办法
1444
查看次数