我一直想知道是否有一种方法可以用惯用的方式在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库中定义).
我目前正面临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 …
当谈到将类别理论应用于泛型编程时,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任何多态固定点的泛型.明知类型如 …
我有一个关于向量的谓词的以下定义,它确定一个是否是一个集合(没有重复的元素).我用类型级布尔值定义成员资格:
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)