Haskell 来自Data.Map的函数->;也许作为一个类实例。困惑于如何实施
在我处理这个问题的过程中,我遇到了一个问题,它同时向我介绍了两个新概念,我很难使它至少输出正确的类型 我的目标是在底部声明的实例中实现Haskell 来自Data.Map的函数->;也许作为一个类实例。困惑于如何实施,haskell,dictionary,maybe,Haskell,Dictionary,Maybe,在我处理这个问题的过程中,我遇到了一个问题,它同时向我介绍了两个新概念,我很难使它至少输出正确的类型 我的目标是在底部声明的实例中实现var,但是,我以前从未使用过作为函数的实例,也没有使用过Data.Map,因此我不太清楚我的解决方案语法应该是什么样子 {-# LANGUAGE FlexibleInstances #-} import qualified Data.Map as M class HasVars a where var :: String -> a -- | T
var
,但是,我以前从未使用过作为函数的实例,也没有使用过Data.Map
,因此我不太清楚我的解决方案语法应该是什么样子
{-# LANGUAGE FlexibleInstances #-}
import qualified Data.Map as M
class HasVars a where
var :: String -> a
-- | This instance allows variables to be interpreted as functions from a
-- mapping of variables to Integer values to (possibly) Integer values
instance HasVars (M.Map String Integer -> Maybe Integer) where
-- not sure how to implement var here
所以,我想出了一些至少可以编译的东西。当我试图通过反复使用
Maybe
作为构造函数来解决这个问题时,我不必要地给自己造成了一些混乱,并且茫然地盯着错误消息,它没有定义Just
是Maybe
的构造函数,Maybe
不是构造函数;太多次了
其次,我使用了lookup…
而不是M.lookup…
来完全屏蔽,导致了意外的类型结果
把这些绊脚石放在一边,下面是我试过的
instance HasVars (M.Map String Integer -> Maybe Integer) where
var str = M.lookup str -- can be Eta-reduced
这是可以编译的,但对我来说没有太多意义的是,根据实例声明,我不应该提供键值Map
M.lookup
将返回一个可能是整数
,但似乎我给的不够,因为它需要一个键和一个映射
,而我似乎没有映射
。也许我对类实例如何工作的理解是错误的。所以当您
class HasVars a where
var :: String -> a
这意味着,对于任何实例a
,都有一个函数var::String->a
因此,如果映射字符串Integer->Maybe Integer
是一个实例,那么这意味着您必须提供一个函数:
var :: String -> (Map String Integer -> Maybe Integer)
请记住,(>)
从右侧关联,因此这里的括号是可选的--
因此,var
是一个函数,它接受一个字符串和一个Map
并返回一个可能是整数。我们来写吧
instance HasVars (Map String Integer -> Maybe Integer) where
-- var :: String -> Map String Integer -> Maybe Integer
var str mp = M.lookup str mp
这很有效
编辑:回答中的问题
我知道你在想为什么
var str = M.lookup str
工作。请记住,M.lookup str
不会返回可能是整数。它返回一个映射字符串Integer->Maybe Integer
。这正是a
应该是的……正是您想要的var str
现在是一个函数,它获取一个映射并返回一个可能是整数
M.lookup str
没有映射,是,因此无法返回可能是Integer
。但它是一个映射字符串整数->可能是整数
。因此,var“hello”
现在是一个映射字符串整数->可能是整数var“hello”
为您提供了一个函数,该函数获取一个映射并返回一个可能是整数
。因此,如果您给var“hello”
一个映射,比如var“hello”mp
,那么您将得到一个可能整数:DEta展开一次,您将看到您的映射<代码>变量str m=m。查找str m
。var str=M.lookup str
定义的是一个参数的函数之间的相等;类似地,var=M.lookup
是两个参数的函数之间的等式。这些定义只是表达同一事物的不同方式。
var str = M.lookup str