Function 如何定义我们自己的show并在haskell中为所有值返回特定内容

Function 如何定义我们自己的show并在haskell中为所有值返回特定内容,function,haskell,module,functional-programming,functor,Function,Haskell,Module,Functional Programming,Functor,我的问题是: 要定义一个名为Locker的新数据类型,该数据类型使用一个键将值装箱,我需要导出两个函数,lock和unlock。在那个之后,我想定义我自己的show,它应该只返回所有值的SECRET,并且locker应该是functor的实例。 lock接受一个键和一个值并返回一个Locker unlock获取一把钥匙和一个储物柜并返回一个值,仅当钥匙 火柴 我的尝试: 导入锁 main=do printLock.lock printLock.unlock 模块锁 f班在哪里 锁::键->值->

我的问题是:

要定义一个名为Locker的新数据类型,该数据类型使用一个键将值装箱,我需要导出两个函数,lock和unlock。在那个之后,我想定义我自己的show,它应该只返回所有值的SECRET,并且locker应该是functor的实例。 lock接受一个键和一个值并返回一个Locker unlock获取一把钥匙和一个储物柜并返回一个值,仅当钥匙 火柴

我的尝试:

导入锁 main=do printLock.lock printLock.unlock 模块锁 f班在哪里 锁::键->值->f键->f值 如果锁定在秒 然后打印秘密 除此之外什么都没有 解锁::钥匙->储物柜->f钥匙->储物柜 错误:
输入“class”的解析错误

我认为这是一个非常常见的误解:Haskell中的类不是OO类,更像是OO接口

我猜你想要这样的东西:

{-语言派生函子-} {-语言标准派生-} 模块主要在哪里 main=do let locked=lock 1234 Hello world 打印锁定 打印$unlock 1234 locked 打印$unlock 1111 locked 数据锁k v=锁k v 派生实例函子k 实例Show v=>Show Locker k v where 显示储物柜uu=储物柜“秘密”“秘密” 锁:k->v->k锁 锁钥匙值=锁钥匙值 解锁::Eq k=>k->Locker k v->Maybe v 解锁钥匙柜钥匙v |实际值=key=Just v |否则=没有 这将输出

Locker 'SECRET' 'SECRET'
Just "Hello world"
Nothing
一些解释:

我没有使用额外的模块,因为我想检查它是否能快速工作-只需将部件从data Locker中移出。。如果只导出Locker而不导出Locker,则将其导入模块中。。从it用户必须使用锁作为智能构造函数来创建锁值

data Locker k v=Locker k v创建一个名为Locker的新类型-它由两个类型参数参数化:k表示密钥类型,v表示值类型

这可能有点让人困惑,但=后面的Locker是一个数据构造函数-它的名称通常与类型类似,但如果您愿意,也可以将其称为MkLocker-这里它有两个值参数-一个是k类型,另一个是v类型,用于键和值

derving实例函子生成一个函子实例,我不知道为什么需要它,但现在你需要两个{LANGUAGE…-}扩展

接下来是Show的实例-ShowWorks print使用Show

锁基本上只是对数据构造函数锁的调用


unlock使用防护装置检查钥匙| ACTURALKEY==钥匙=。。部分-为此,它需要键类型是Eq类的实例请参见类;-你需要这个,因为==只处理Eq中定义的==非常感谢,但是我如何才能将秘密返回到所有值我不知道你的意思-你想打印秘密吗?是的,先生,我需要定义我自己的show,它应该返回secretfor all values这在这里是这样的-我想这有点无用-这是exampleLocker类型中的第一个输出定义一个名为Locker的新数据类型,它用一个键将值装箱。您应该在自己的模块中定义Locker。您应该只导出两个功能:锁定和解锁。你需要定义你自己的show,它应该只为所有值返回SECRET,你需要使Locker成为Functor的实例lock接受一个键和一个值并返回一个Locker unlock接受一个键和一个Locker并返回一个Maybe,仅当键匹配时才返回值。您可以要求密钥为Int