我在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) 我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.
我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .
步骤:
代码:
{-# 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
我正在尝试编写一个改变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) 我有一个常见的模式,我有一个类型级别的类型列表[*],我想* -> *对列表中的每个元素应用类型的构造函数.例如,我想将类型更改'[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) 我对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,幻像类型信息存储在哪里?
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)
哪里f是flip delete.
所以从a的第一个元素中删除x并从结果列表中删除子列表a2和a3.所以我们将获得a1独有的所有值.它似乎是一个列表列表.不知道这是否正确.
我有这个单形代码:
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) 我有一个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)
如果暴露了所有类型,这将非常有用.但是,我正在使用函数依赖项来生成约束列表中的某些类型,并且这些类型不会出现在签名中 …
从文件:
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的懒惰吗?
我有一个包含data Zq q = Zq Int表示整数的类型的库mod q.为了安全起见,我想在这种类型((+),(*)等)上公开一些操作,但是不要导出构造函数以避免人们通过首先声明这样的类型来规避安全性.
但是,库的用户可能需要声明我作为库作者无法预测的此类型的实例.仅举几个可能的实例:DeepSeq,Storable,Unbox,...
我知道的唯一方法允许第三方制作此类实例是导出构造函数.(或者,我可以定义并导出一个智能构造函数和析构函数,但这似乎并不比导出数据构造函数更好.)
有没有办法确保安全,同时还允许第三方扩展类型?