小编cro*_*eea的帖子

GHC.Prim中的可疑代码

我在GHC.Prim中遇到了以下代码:

...

negateFloat# :: Float# -> Float#
negateFloat# = let x = x in x

-- |Truncates a @Float#@ value to the nearest @Int#@.
--     Results are undefined if the truncation if truncation yields
--     a value outside the range of @Int#@.

float2Int# :: Float# -> Int#
float2Int# = let x = x in x

expFloat# :: Float# -> Float#
expFloat# = let x = x in x

logFloat# :: Float# -> Float#
logFloat# = let x = …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

4
推荐指数
1
解决办法
216
查看次数

并行维修代码不会产生火花

我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.

我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .

步骤:

  1. 将列表分成对(没有并行性)
  2. 压缩分块列表(没有并行性)
  3. 将产品功能映射到此列表(使用Repa map),创建一个Delayed数组
  4. 调用computeP来并行计算地图
  5. 将Repa结果转换回列表
  6. 进行递归调用(在列表的一半大小的输入)

代码:

{-# LANGUAGE TypeOperators, FlexibleContexts, BangPatterns #-}

import System.Random
import System.Environment (getArgs)
import Control.Monad.State
import Control.Monad.Identity (runIdentity)

import Data.Array.Repa as Repa
import Data.Array.Repa.Eval as Eval
import Data.Array.Repa.Repr.Vector

force :: (Shape sh) => Array D sh e -> Array V sh e
force = runIdentity . computeP

chunk :: [a] -> [(a,a)]
chunk [] = []
chunk (x1:x2:xs) = (x1,x2):(chunk xs)

slow_fib :: Int -> Integer
slow_fib 0 …
Run Code Online (Sandbox Code Playgroud)

parallel-processing monads haskell repa data-parallel-haskell

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

"do"表示法的新范围

我正在尝试编写一个改变Data.Vector.Unboxed.Mutable'Vector'的递归函数,尽管这个问题适用于任何monadic代码,我想.

作为一个人为的例子:

import Data.Vector.Unboxed as U
import Data.Vector.Unboxed.Mutable as M
import Control.Monad
import Control.Monad.ST
import Control.Monad.Primitive

f :: U.Vector Int -> U.Vector Int
f x = runST $ do
        y <- U.thaw x
        add1 y 0
        U.freeze y

add1 :: (PrimMonad m) => MVector (PrimState m) Int -> Int -> m()
add1 v i | i == M.length v = return ()
add1 v i = do
     c <- M.unsafeRead v i
     M.unsafeWrite v i (c + 1)
     add1 v …
Run Code Online (Sandbox Code Playgroud)

monads haskell

2
推荐指数
1
解决办法
197
查看次数

使用DataKinds的类型级映射

我有一个常见的模式,我有一个类型级别的类型列表[*],我想* -> *对列表中的每个元素应用类型的构造函数.例如,我想将类型更改'[Int, Double, Integer]'[Maybe Int, Maybe Double, Maybe Integer].

这是我尝试实现类型级别map.

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, TypeOperators, DataKinds, ScopedTypeVariables, GADTs #-}

-- turns a type list '[b1, b2, b3]
-- into the type list '[a b1, a b2, a b3]
class TypeMap (a :: * -> *) (bs :: [*]) where
    type Map a bs :: [*]

instance TypeMap a '[b] where
    type Map a '[b] = '[a b] …
Run Code Online (Sandbox Code Playgroud)

haskell type-inference data-kinds

2
推荐指数
1
解决办法
874
查看次数

幻像类型如何与newtype一起使用?

我对newtypes的理解是它们是由GHC编译出来的.然而,这不是全部故事,因为幻影类型可以保存信息.

这里:

你可以将[a type]包装在newtype中,它将被视为与type-checker不同,但在运行时是相同的.然后,您可以使用各种深度欺骗,如幻像或递归类型,而无需担心GHC改组字节数据无缘无故.

例如,假设一个表示算术模q的newtype:

newtype Zq q = Zq Int

class Modulus q where
    getModulus :: q -> Int

addZq :: (Modulus q) => Zq q -> Zq q -> Zq q
addZq (Zq a) (Zq b) = Zq $ (a+b) `mod` (getModulus (undefined :: q))
Run Code Online (Sandbox Code Playgroud)

addZq 无法编译到

addZq :: Int -> Int -> Int
Run Code Online (Sandbox Code Playgroud)

所以在什么意义上编译出newtype,幻像类型信息存储在哪里?

haskell newtype phantom-types

2
推荐指数
1
解决办法
326
查看次数

找出函数的作用

c a = (a\\).(a\\)
Run Code Online (Sandbox Code Playgroud)

我知道(\\)= foldl (flip delete)它是标准功能.

delete x [] = []
delete x (y:ys) = if x == y then ys else y : delete x ys 
Run Code Online (Sandbox Code Playgroud)

我想知道我能找出什么功能c.我该怎么办?如果我只关注(a\\) 删除需要列表和我们想要从列表中删除的斧头. (a\\)已经去了一个列表,所以我们需要发送一个我们想删除的值x.a=[a1,a2,a3]

foldl => (a1 'f' x) 'f' a2) 'f' a3  
Run Code Online (Sandbox Code Playgroud)

哪里fflip delete.

所以从a的第一个元素中删除x并从结果列表中删除子列表a2和a3.所以我们将获得a1独有的所有值.它似乎是一个列表列表.不知道这是否正确.

haskell

2
推荐指数
1
解决办法
127
查看次数

将类型变量约束为具体类型

我有这个单形代码:

import Data.Array.MArray
import Data.Array.IO (IOUArray)
import Data.Ix (Ix)

push :: IOUArray Int Int -> Int -> [Int] -> IO Int
push stack top [] = return top
push stack top (k:ks) = do
  v <- readArray stack k
  if v >= 0 then push stack top ks
            else do writeArray stack k top
                    push stack k ks
Run Code Online (Sandbox Code Playgroud)

一个完全多态的签名push是:

push :: (MArray a e m, Ix e, Num e)  => a e e -> e -> [e] -> …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell type-variables

2
推荐指数
1
解决办法
84
查看次数

用fundeps捆绑约束

我有一个foo带有一连串限制的函数.当然这些约束必须出现在使用的函数的签名中foo,所以我要做的是将foo约束包装在类型同义词中FooCtx a b ... :: Constraint.举个例子,

foo :: (A a, B b, C c, ...) => a -> b -> c

bar :: (A a, B b, C c, ...) ...
bar = ... foo ...
Run Code Online (Sandbox Code Playgroud)

会成为

type FooCtx a b c ... = (A a, B b, C c, ...)
foo :: (FooCtx a b c) => a -> b -> c
bar :: (FooCtx a b c) => ...
Run Code Online (Sandbox Code Playgroud)

如果暴露了所有类型,这将非常有用.但是,我正在使用函数依赖项来生成约束列表中的某些类型,并且这些类型不会出现在签名中 …

haskell ghc type-constraints functional-dependencies

2
推荐指数
1
解决办法
61
查看次数

如何理解"m()"是一个monadic计算

文件:

when :: (Monad m) => Bool -> m () -> m ()
when p s = if p then s else return ()
Run Code Online (Sandbox Code Playgroud)

when函数采用布尔参数和单元()类型的monadic计算,并仅在布尔参数为时执行计算True.

===

作为一个Haskell新手,我的问题是对我来说m ()是一些"无效"数据,但在这里文档提到它是计算.是因为Haskell的懒惰吗?

monads haskell

2
推荐指数
1
解决办法
95
查看次数

获得安全性和可扩展性

我有一个包含data Zq q = Zq Int表示整数的类型的库mod q.为了安全起见,我想在这种类型((+),(*)等)上公开一些操作,但是不要导出构造函数以避免人们通过首先声明这样的类型来规避安全性.

但是,库的用户可能需要声明我作为库作者无法预测的此类型的实例.仅举几个可能的实例:DeepSeq,Storable,Unbox,...

我知道的唯一方法允许第三方制作此类实例是导出构造函数.(或者,我可以定义并导出一个智能构造函数和析构函数,但这似乎并不比导出数据构造函数更好.)

有没有办法确保安全,同时还允许第三方扩展类型?

haskell

2
推荐指数
1
解决办法
64
查看次数