小编gon*_*zaw的帖子

Haskell中的有限状态传感器?

我一直想知道是否有一种方法可以用惯用的方式在Haskell中定义和使用有限状态传感器.

您可以将FST作为生成器(它生成类型为{x1,x2}的输出),或者作为识别器(给定类型为{x1,x2}的输入,如果它属于理性关系则识别它),或者作为转换器(给定输入磁带,它将其转换为输出磁带).表示会根据方法而改变吗?

是否也可以通过指定重写规则来生成FST模型?例如,创建一个DSL来模拟重写规则,然后创建一个函数createFST :: [Rule] -> FST.

我能找到的最接近的是Kmett,Bjarnason和Cough的machines图书馆:https: //hackage.haskell.org/package/machines

但我似乎无法意识到如何用FST建模FST Machine.我认为这样做的正确方法与他们定义Moore和Mealy机器的方式类似:将FST定义为不同的实体,但提供一个Automaton能够将其用作机器的实例.

我也找到了其他一些选项,但是他们以一种简单的方式定义它(比如在https://hackage.haskell.org/package/fst中).这并不能说服我,因为我想知道是否有更好的方法来使用Haskell类型系统的优势(比如Moore和Mealy机器如何在machines库中定义).

haskell state-machine transducer

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

C#中的存在类型?

我目前正面临C#中的问题,我认为可以使用存在类型来解决.但是,我真的不知道它们是可以用C#创建还是模拟(使用其他构造).

基本上我想要一些像这样的代码:

public interface MyInterface<T>
{
    T GetSomething();
    void DoSomething(T something);
}

public class MyIntClass : MyInterface<int>
{
    int GetSomething()
    {
        return 42;
    }

    void DoSomething(int something)
    {
        Console.Write(something);
    }
}

public class MyStringClass : MyInterface<string>
{
    string GetSomething()
    {
        return "Something";
    }

    void DoSomething(string something)
    {
        SomeStaticClass.DoSomethingWithString(something);
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我希望能够遍历实现此接口的对象列表,但不关心它具有什么类型参数.像这样的东西:

public static void DoALotOfThingsTwice(){
    var listOfThings = new List<MyInterface<T>>(){
        new MyIntClass(),
        new MyStringClass();
    };

    foreach (MyInterface<T> thingDoer in listOfThings){
        T something = thingDoer.GetSomething();
        thingDoer.DoSomething(something);
        thingDoer.DoSomething(something);
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为T …

c# polymorphism existential-type

12
推荐指数
3
解决办法
553
查看次数

Haskell中泛型多态ADT的Functor实例?

当谈到将类别理论应用于泛型编程时,Haskell做得非常好,例如像库这样的库recursion-schemes.然而,我不确定的一件事是如何为多态类型创建通用仿函数实例.

如果你有一个多态类型,比如List或Tree,你可以创建一个从(Hask×Hask)到Hask的仿函数代表它们.例如:

data ListF a b = NilF | ConsF a b  -- L(A,B) = 1+A×B
data TreeF a b = EmptyF | NodeF a b b -- T(A,B) = 1+A×B×B
Run Code Online (Sandbox Code Playgroud)

这些类型在A上是多态的,但是关于B是固定点,如下所示:

newtype Fix f = Fix { unFix :: f (Fix f) }
type List a = Fix (ListF a)
type Tree a = Fix (TreeF a)
Run Code Online (Sandbox Code Playgroud)

但是大多数人都知道,列表和树也是通常意义上的仿函数,它们代表了as 的"容器" ,你可以映射一个函数f :: a -> b来获取容器b.

我试图找出是否有办法以Functor通用的方式使这些类型(固定点)成为一个实例,但我不确定如何.到目前为止我遇到了以下两个问题:


1)首先,必须有一种方法来定义gmap任何多态固定点的泛型.明知类型如 …

recursion haskell functor category-theory

10
推荐指数
2
解决办法
361
查看次数

在伊德里斯看似矛盾的说法

我有一个关于向量的谓词的以下定义,它确定一个是否是一个集合(没有重复的元素).我用类型级布尔值定义成员资格:

import Data.Vect

%default total

data ElemBool : Eq t => t -> Vect n t -> Bool -> Type where
  ElemBoolNil : Eq t => ElemBool {t=t} a [] False
  ElemBoolCons : Eq t => ElemBool {t=t} x1 xs b -> ElemBool x1 (x2 :: xs) ((x1 == x2) || b)

data IsSet : Eq t => Vect n t -> Type where
  IsSetNil : Eq t => IsSet {t=t} []
  IsSetCons : Eq t => ElemBool {t=t} x …
Run Code Online (Sandbox Code Playgroud)

proof dependent-type type-level-computation idris

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