微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何定义我们自己的节目并为 haskell 中的所有值返回特定的任何内容

如何解决如何定义我们自己的节目并为 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 举报,一经查实,本站将立刻删除。