小编HTN*_*TNW的帖子

融合长度索引链表

我有标准Vect类型:

module Vect where

data Nat = Z | S Nat
data Vect (n :: Nat) (a :: Type) where
  VNil :: Vect Z a
  VCons :: a -> Vect n a -> Vect (S n) a
Run Code Online (Sandbox Code Playgroud)

我有这些功能:

foldVect :: forall (p :: Nat -> Type) n a.
            p Z ->
            (forall m. a -> p m -> p (S m)) ->
            Vect n a -> p n
foldVect n c = go
  where go :: forall l. …
Run Code Online (Sandbox Code Playgroud)

optimization haskell

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

约束蕴涵作为约束

如何将 Haskell 中的约束蕴涵编码为新约束?在我的示例中,我想要求每个都Functor c d f需要Obj c x暗示Obj c (f x). 我正在写约束forall x . Obj c x => Obj d (f x)

{-# LANGUAGE AllowAmbiguousTypes       #-}
{-# LANGUAGE KindSignatures            #-}
{-# LANGUAGE MultiParamTypeClasses     #-}
{-# LANGUAGE RankNTypes                #-}
{-# LANGUAGE ScopedTypeVariables       #-}
{-# LANGUAGE TypeApplications          #-}
{-# LANGUAGE TypeFamilies              #-}
{-# LANGUAGE QuantifiedConstraints     #-}

import Prelude hiding (id, Functor, fmap)
import Data.Kind

class Category c where                            
  type Obj c a :: Constraint …
Run Code Online (Sandbox Code Playgroud)

haskell ghc rank-n-types

5
推荐指数
0
解决办法
112
查看次数

Haskell的inline-C可以将typedef返回给函数指针吗?

我正在使用C代码库

typedef void(* wl_notify_func_t) (struct wl_listener *listener, void *data) 

//...

struct wl_listener {
  struct wl_list link;
  wl_notify_func_t notify; //<-- I'd like to return this
};
Run Code Online (Sandbox Code Playgroud)

并使用了Haskell代码

type NotifyFuncT = FunPtr (Ptr C'WlListener -> Ptr () -> IO ())

initializeMyCtx = C.context $ C.baseCtx <> C.funCtx <> mempty {
  C.ctxTypesTable = Data.Map.fromList [
     (C.Struct "wl_listener", [t|C'WlListener|])
  -- ...
  ,  (C.TypeName "wl_notify_func_t", [t|NotifyFuncT|])
  ]
}

someHaskellFunction :: Ptr C'WlListener -> IO NotifyFuncT
someHaskellFunction ptrToWlListener = do
  funPtr <- [C.block| wl_notify_func_t {return $(struct …
Run Code Online (Sandbox Code Playgroud)

c haskell ffi inline-c

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

Haskell线程何时加入?

作为一名前C ++程序员,Haskell线程的行为令人困惑。请参考以下Haskell代码段:

import Control.Concurrent
import Control.Concurrent.MVar
import Data.Functor.Compose
import System.Random

randomTill0 :: MVar () -> IO () -- Roll a die until 0 comes
randomTill0 mV = do
    x <- randomRIO (0,65535) :: IO Int
    if 0 == x
        then putMVar mV ()
        else randomTill0 mV

main :: IO ()
main = do
    n <- getNumCapabilities
    mV <- newEmptyMVar
    sequence (replicate n (forkIO (randomTill0 mV)))
    readMVar mV
    putStrLn "Excution complete."
Run Code Online (Sandbox Code Playgroud)

据我所知,Haskell的forkIO大致相当于C ++的std::async。在C ++中,我存储一个std::future由返回的std::async …

c++ multithreading haskell

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

确保异构列表包含一个类型类

我写我自己的异类列表实现(我第一次读到异类列表在这里和我的实现非常相似,他们的)

{-# LANGUAGE GADTs, DataKinds, TypeOperators #-}

data HList a where
  (:>) :: a -> HList b -> HList (a ': b)
  Nil  :: HList '[]
infixr 6 :>
Run Code Online (Sandbox Code Playgroud)

这很棒; 然而,一旦我发现自己正在使用这些异构列表,我发现自己经常想要表达一个每个类型属于特定类型类的想法.我天真的第一个解决方案是HList完全为每个新类型类重写数据类型.这是它的Eq(例如,它不是我唯一关注的类型类):

{-# LANGUAGE GADTs, DataKinds, TypeOperators #-}

data EqHList a where
  (:>) :: (Eq a) => a -> EqHList b -> EqHList (a ': b)
  Nil :: EqHList '[]
infixr 6 :>
Run Code Online (Sandbox Code Playgroud)

这有很多问题.首先,我需要在每次需要新类型时重写它.此外,在我的旧异构列表上工作的函数不适用于新的异构列表.

我的下一个解决方案是使用空类型.

{-# LANGUAGE GADTs, DataKinds, TypeOperators, FlexibleInstances, FlexibleContexts #-}

data HList …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming type-level-computation

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

haskell 中负整数的除法规则是什么?

在 GHCI 中,我得到以下结果:

div (-7) ( 2) = -4
div ( 7) (-2) = -4
div (-7) (-2) =  3

mod ( 7)  ( 2) =  1
mod ( 7)  (-2) = -1
mod (-7)  ( 2) =  1
mod (-7)  (-2) = -1
Run Code Online (Sandbox Code Playgroud)

并且div 4 (-3)-2并且mod 4 (-3)-2

我无法理解如何获得这些结果。有什么法律或规则吗?什么是正确的计算步骤?

haskell division modulo

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