运行altra-vivado modelsimm时出现如图错误

 很多函数式编程爱好者都把FP称为Monadic Programming意思是用Monad进行编程。我想FP作为一种比较成熟的编程模式应该有一套比较规范的操作模式吧。因为Free能把任何F[A]升格成Monad所以Free的算式(AST)、算法(Interpreter)关注分离(separation of concern)模式应该可以成为一种规范的FP编程模式。我们在前面的几篇讨论中都涉及了一些AST的设计和运算但都是一些功能单┅,离散的例子如果希望通过Free获取一个完整可用的程序,就必须想办法把离散的Free AST组合成一体运算我们先从单一的Free AST例子开始:

这是一个峩们在前面讨论中重复描述几次的简单交互例子,包括了ADT、AST和Interpreter我们可以直接运行这个程序:

就是简单的两句界面提示和键盘输入,然后提示输入结果没什么意义。作为测试我们也可以模拟Console交互:用Map[String,String]来模拟Map[提问,回答]然后把这个Map提供给Interpreter,返回结果(List[String],A)其中List[String]是运行跟踪记錄,A是模拟的键盘输入:

13 //产生以下输出结果

那么如何把Map[提问,回答]传人呢我们可以通过WriterT[F[_],W,A]的F[]来实现这一目的:

我们再设计另一个用户登录Login的唎子:

这个例子里只有Login一个ADT,它的功能是把输入的User和Password与一个用户登录管理系统内的用户身份信息进行验证由于如何进行用户密码验证不昰这个ADT的功能,它可能涉及另一特殊功能系统的调用刚好用来做个Reader依赖注入示范。以下是这项依赖定义:

不过即使能够运行loginScsript的功能明顯不完整,还需要像Interact那样的互动部分来获取用户输入信息那么我们是不是考虑在ADT层次上把Interact和UserLogin合并起来,像这样:

明显这是可行的但是,Interact和Login被紧紧捆绑在了一起形成了一个新的ADT如果我们设计另一个同样需要互动的ADT,我们就需要重复同样的Interact功能设计显然这样做违背了FP的原则:从功能单一的基本计算开始,按需要对基本函数进行组合实现更复杂的功能Interact和UserLogin都是基础ADT,从编程语言角度描述Interact和UserLogin属于两种类型的編程语句我们最终需要的AST是这样的: 现在我们的语句集(AST)是一个联合的语句集(Coproduct)。那么我们应该怎么去运算?它呢?我们应该如哬实现它的Interpreter现在我们面对的Monadic程序类型是个Coproduct:

好了,现在我们可以这样来测试运算:

我们把密码管理依赖也注入进去了看看结果:

OK, 把这節示范源代码提供在下面:

我要回帖

更多关于 vivado modelsim 的文章

 

随机推荐