首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数Typeclass实例

函数Typeclass实例
EN

Stack Overflow用户
提问于 2014-07-23 12:55:55
回答 1查看 204关注 0票数 2

我正在为顺式194做作业。

我被困在家庭作业5,问题6。

类型类Expr用于表示表达式,而类型类HasVars用于任何包含变量的表达式。

这个问题要求实现Expr for M.Map String Integer -> Maybe Integer的一个实例,其中MData.Map

代码语言:javascript
复制
class Expr a where 
  add :: a -> a -> a
  mul :: a -> a -> a
  lit :: Integer -> a

下面是Expr for Integer的代码。

代码语言:javascript
复制
instance Expr Integer where
  add m n = m + n
  mul m n = m * n
  lit m = m 

对于函数的HasVars实例,

代码语言:javascript
复制
instance HasVars (M.Map String Integer -> Maybe Integer) where
   var s  = M.lookup s 

我对如何为函数类型创建Expr实例感到困惑。如何进行模式匹配或从函数中提取值?类型是a-> a -> a,因此我没有提取值的Map,而从ShowVars中提取的var用于将String转换为上述函数。

我不会对问题的其他部分提出解决方案,因为它可能包含剧透。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-23 13:08:38

好吧,先把签名写出来,这样才能弄清楚应该是什么东西。为了提高它的可读性,

代码语言:javascript
复制
type MS2I = M.Map String Integer
type Integer' = Maybe Integer

然后

代码语言:javascript
复制
add :: (MS2I -> Integer') -> (MS2I -> Integer') -> (MS2I -> Integer')

所以你可以从

代码语言:javascript
复制
add m n = o
 where m, n, o :: MS2I -> Integer'

所以o是一个用地图.你可以定义:

代码语言:javascript
复制
add m n = o
 where o ms2i = ...

在这一点上你有一张地图。您可以将其提供给参数:

代码语言:javascript
复制
add m n = o
 where o ms2i = let i1 = m ms2i
                    i2 = n ms2i
                    i1, i2 :: Integer'
                in ...?   

其余的应该是显而易见的,您只需要将两个Maybe Integer组合成一个新的。(最好使用Applicative.)

为了好玩和参考,这里有一个超浓缩的版本:

代码语言:javascript
复制
import Control.Arrow
instance Expr (Kleisli Maybe MS2I Integer) where
  add m n = arr (uncurry(+)) . (m&&&n)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24911097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档