小编kni*_*ick的帖子

'State'的数据构造函数在哪里?

在阅读了几个关于Haskell状态monad的教程之后,我想自己尝试一下.我读过的教程声称Control.Monad.State提供了以下定义:

newtype State s a = State { runState :: s -> (a,s) }  
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法找到State数据构造函数:

Prelude> import Control.Monad.State
Prelude Control.Monad.State> :t State

<interactive>:1:1:
    Not in scope: data constructor `State'
    Perhaps you meant `StateT' (imported from Control.Monad.State)
Run Code Online (Sandbox Code Playgroud)

我也尝试过Hoogle搜索,State但没有找到任何具有预期类型的​​数据构造函数.

在哪儿State构造去了?它曾经存在过吗?或者我只是在错误的地方寻找?基本上我想知道我需要做什么来创建状态monad.

monads haskell

20
推荐指数
3
解决办法
1923
查看次数

哈斯克尔$!运算符和无限列表

我看了$!操作员强制严格评估.那么为什么这仍然有效呢?

Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)

我期待ghc永远磨掉,试图评估1的无限列表.

haskell lazy-evaluation

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

继承ICollection <T>的抽象基类

假设我有一个抽象基类BaseTimeCollection和至少一个ConcreteTimeCollection继承自基类的具体类.

我希望我的基类继承自己ICollection<T>.

继承ICollection<T>需要我提供许多方法的实现,包括IEnumerable.GetEnumerator()IEnumerable<T>.GetEnumerator.

我不想实现这些方法BaseTimeCollection- 相反,我更愿意在每个具体类中单独实现它们.

这是我遇到麻烦的地方.

这些GetEnumerator方法需要明确声明,因为它们中有两个具有相同的名称但返回类型不同.但是,似乎只要我使签名显式,我就不能再使用abstract修饰符了.基本上我被迫GetEnumerator在我的基类中实现该方法.

public abstract class BaseTimeCollection : ICollection<Time>
{
    abstract IEnumerator IEnumerable.GetEnumerator();  // compile error: The modifier    'abstract' is not valid for this item
    abstract IEnumerator<Time> IEnumerable<Time>.GetEnumerator(); // compile error: The       modifier 'abstract' is not valid for this item
}

public class ConcreteTimeCollection : BaseTimeCollection
{
    IEnumerator IEnumerable.GetEnumerator()
    {
       // this is where I would like to …
Run Code Online (Sandbox Code Playgroud)

c# collections inheritance interface

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

使用带闭包的 lambda 回调

我正在尝试实现一个回调,该回调将控制从中断服务例程传递到 c++ 类上的成员函数。我认为lambdas和闭包将是一种方便的方法,但我在实现它时遇到了麻烦。下面是我的代码的简化版本。

我遇到的问题是如何将“函数指针”存储到“ lambda ”。

class Gpio
{
  public:
    typedef void (*ExtiHandler)();    
  private:
    ExtiHandler handler;    
  public:
    void enable_irq(ExtiHandler handler_in) 
    { 
      // enable interrupt
      // ...
      // save handler so callback can be issued later
      handler = handler_in;
    }
};

class Button
{
  private:
    Gpio& pin;    
  public:
    Button(Gpio& pin_in) : pin(pin_in) 
    {
    };

    void button_pressed()
    {
      // do something
    }

    void init()
    {
      pin.enable_irq([this]() { this->button_pressed(); });
    }
};
Run Code Online (Sandbox Code Playgroud)

编译失败并显示以下错误消息;

 no matching function for call to …
Run Code Online (Sandbox Code Playgroud)

c++ lambda closures function-pointers c++11

5
推荐指数
2
解决办法
1714
查看次数

c#的后期评估?

我正在研究c#中的应用程序.为了使这个应用程序工作,我发现自己做了一些对我选择的语言感到非常不自然的事情.在经历了许多重构和改进后,我逐渐意识到我试图实现的功能实际上是一种"懒惰评估"(我认为).这就是我想要的......

// Criteria 1: Lazy evaluation of expressions
int x = LazyEvaluated.New<int>();
int y = LazyEvaluated.New<int>();
int z = LazyEvaluated.New<int>();

z.Assign(x + y);
Assert.ThrowsException(z.Evalutate());
x.Assign(1);
Assert.ThrowsException(z.Evalutate());
y.Assign(2);
Assert.Equals(3, z.Evaluate());
x.Assign(3);
Assert.Equals(5, z.Evaluate());

// Criteria 2: Referencing relative to parent object    
Car myCar = LazyEvaluated.New<Car>();
Engine engineInMyCar = LazyEvaluated.New<Engine>();
double displacementOfMyEngine = LazyEvaluated.New<double>();

engineInMyCar = myCar.Engine;
displacementOfMyEngine = engineInMyCar.Displacement;

Car subaru = new Car(new FlatFourEngine());
Car falcon = new Car(new InlineSixEngine());

myCar.Assign(subaru);
Assert.IsTypeOf<FlatFourEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(2.0, displacementOfMyEngine.Evaluate());

myCar.Assign(falcon);
Assert.IsTypeOf<InlineSixEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(4.0, displacementOfMyEngine.Evaluate());
Run Code Online (Sandbox Code Playgroud)

这些是我用于说明的简单类定义......

public …
Run Code Online (Sandbox Code Playgroud)

c# programming-languages lazy-evaluation

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

何时在Haskell中使用Multiparameter类型?

我想了解Collection类型的以下两个定义之间的区别.

具有多参数类型类和功能依赖性(取自此处);

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

class Eq e => Collection c e | c -> e where
    insert :: c -> e -> c
    member :: c -> e -> Bool

instance Eq a => Collection [a] a where
    insert = flip (:)
    member = flip elem
Run Code Online (Sandbox Code Playgroud)

只有一个类型参数;

class Collection c where
    insert :: Eq e => c e -> e -> c e
    member :: Eq e => c e -> e -> Bool …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass

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

在T的静态成员中使用sizeof(T)的c ++错误

为什么我的编译器不允许这样做?

class Resource
{
   private:
      static const int max_instances = 10;

      // set aside memory to be used later with placement new
      static char memory[max_instances * sizeof(Resource)]; // error: invalid application of 'sizeof' to incomplete type 'Resource'
};
Run Code Online (Sandbox Code Playgroud)

c++ sizeof

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

Haskell代码不会编译

我正在努力学习Haskell,所以我想我会潜入并尝试一个monad.请参阅下面的我对Calc的实现.这类似于State monad,除了state始终是用于缓存结果的Map.每个Calc都有自己的GUID(尚未实现),用作从地图中检索缓存值的键.

import qualified Data.Map as Map
import Control.Monad
import Data.Dynamic

type CalcId = Int

type Ctx = Map.Map CalcId Dynamic

data Calc a = Calc { eval :: Ctx -> (a, Ctx),
                 guid :: CalcId }

instance Monad Calc where
    (>>=) :: Calc a -> (a -> Calc b) -> Calc b
    c1 >>= f = Calc {eval=c2Eval, guid=c2Id}
        where c2Id = 1 -- need a way of generating a GUID. add later.
              c2Eval = \ctx -> 
                    case (Map.lookup …
Run Code Online (Sandbox Code Playgroud)

haskell compiler-errors

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