如何解决如何定义我们自己的节目并为 haskell 中的所有值返回特定的任何内容
我的问题:
要定义一个名为 Locker 的新数据类型,用一个键将值装箱,我需要导出两个函数,lock 和 unlock。之后我想定义我自己的节目(它应该只为所有值返回“SECRET”),并且更衣室应该是函子的实例。 lock 接受一个键和一个值并返回一个 Locker 解锁需要一个钥匙和一个储物柜并返回一个Maybe,只有当钥匙出现时才返回值 匹配。
我的尝试:
import Lock
main = do
print(Lock.lock)
print(Lock.unlock)
module Lock
class Locker f where
lock :: (key -> value) -> f key -> f value
if lock in sec
then print("secret")
else print("nothing")
unlock :: (key -> locker) -> f key -> locker
解决方法
我认为这是一个非常普遍的误解:Haskell 中的 class
不是面向对象的类,而更像是面向对象的接口。
我猜你想要这样的东西:
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE StandaloneDeriving #-}
module Main where
main = do
let locked = lock "1234" "Hello world"
print locked
print $ unlock "1234" locked
print $ unlock "1111" locked
data Locker k v = Locker k v
deriving instance Functor (Locker k)
instance Show v => Show (Locker k v) where
show (Locker _ _) = "Locker 'SECRET' 'SECRET'"
lock :: k -> v -> Locker k v
lock key value = Locker key value
unlock :: Eq k => k -> Locker k v -> Maybe v
unlock key (Locker actualKey v)
| actualKey == key = Just v
| otherwise = Nothing
这将输出
Locker 'SECRET' 'SECRET'
Just "Hello world"
Nothing
一些解释:
我没有使用额外的模块,因为我想检查这是否可以快速运行 - 只需将部分从 data Locker ..
移动到您的模块中 - 如果您只导出 Locker
(而不是 Locker(..)
) 用户必须使用 lock
(作为智能构造函数)来创建 Locker
值。
data Locker k v = Locker k v
创建一个名为 Locker
的新类型 - 它由两个类型参数参数化:k
表示键类型,v
表示值类型。
这可能有点令人困惑,但 Locker
后面的 =
是一个 data-constructor
- 它通常以类型命名,但如果您愿意,您可以将其称为 MkLocker
也是 - 在这里它需要两个值参数 - 一个类型 k
和一个类型 v
用于您的键和值。
derving instance Functor
生成一个函子实例(不知道你为什么想要它,但你可以这样做) - 为此你需要两个 {-# LANGUAGE ... #-}
扩展。
接下来是 Show
的实例 - 因此 show
可以工作(print
使用 show
!)
lock
基本上只是对数据构造函数 Locker
unlock
使用守卫检查密钥(| actualKey == key = ..
部分) - 为此,它需要密钥类型是 Eq
类的实例(参见 class ;) ) - 您需要这个,因为 ==
working 仅适用于那些(==
在 {{1} 中定义 })
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。