我不明白"类型级编程"的含义,也无法使用Google找到合适的解释.
有人可以提供一个演示类型级编程的示例吗?范式的解释和/或定义将是有用的和受到赞赏的.
我有一个程序,它花费大部分时间来计算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) 我有以下程序将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) 我想为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
在这篇博客文章中,作者解释了使用Free monad净化代码的等式推理优势.Free Monad变压器FreeT是否保留了这些优势,即使它包裹在IO之外?
我实现了康威的生命游戏.我希望通过使用并行性来加速它.
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) 我有一个类型类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) 我非常熟悉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) 我有一个程序,我正在尝试并行化(这里完全粘贴可运行的代码).
我已经分析过并发现大部分时间花费在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) 这是我第一次尝试创建类的自定义实例,如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 ×9
performance ×2
compile-time ×1
core ×1
deriving ×1
gadt ×1
ghc ×1
instances ×1
java ×1
polymorphism ×1
scala ×1
simd ×1
typeclass ×1