Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 来自Data.Map的函数->;也许作为一个类实例。困惑于如何实施_Haskell_Dictionary_Maybe - Fatal编程技术网

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
,那么您将得到一个
可能整数:D

Eta展开一次,您将看到您的映射<代码>变量str m=m。查找str m
var str=M.lookup str
定义的是一个参数的函数之间的相等;类似地,
var=M.lookup
是两个参数的函数之间的等式。这些定义只是表达同一事物的不同方式。
var str = M.lookup str