繁体   English   中英

测试自定义数据类型的haskell io

[英]test haskell io for custom data type

更新:我注意到我的代码设计存在问题。 我的代码的整体结构发生了很大变化,以至于对这个问题的任何答案都或多或少与其当前状态无关。 但是 SO 说最好不要删除已回答的问题,所以我保留了这个问题。

我的代码的问题是类型类对于我想做的事情来说太通用了。 现在我专注于编写函数,例如

makeModelId :: String -> Either StringValueError ModelId

然后用类似的东西扩展它:

makeModelIdM :: (Monad m) => String -> m (Either StringValueError ModelId)
makeModelIdM astr = do
  idstr <- astr
  return (makeModelId idstr)

我不确定这是否是最好的方法。


我知道有很多类似的问题,比如 这个这个这个,据我所知,我想要做的事情可以用HUnit来实现。 但我似乎无法找到这样做的确切方法。

我基本上有一个 setter 类型类,它是

class StringLike2Primitive model where
    fromString :: String -> model
    fromText :: Text -> model
    fromText aText = fromString (unpack aText)

class (StringLike2Primitive model) => StringLike2PrimitiveM model where
    fromStringM :: (MonadPlus m) => String -> m model
    fromTextM :: (MonadPlus m) => Text -> m model
    fromStringM astr =  return (fromString astr)
    fromTextM aText = fromStringM (unpack aText)

我有几个数据类型实现了这些类型类,例如:

instance StringLike2Primitive ModelId where
    fromString = StringIdCons

instance StringLike2PrimitiveM ModelId where
    fromStringM aStr
        | null aStr = fail "empty string is not allowed as id"
        | not (isAlphaNumStr aStr) = fail
            "Only ascii alphanumeric strings are allowed"
        | not (isAsciiStr aStr) = fail
            "Only ascii alphanumeric strings are allowed"

我不确定如何在单元测试环境中针对受保护的值测试fromStringM函数,而且我认为我的错误处理方法有问题。 任何提示将不胜感激。

(这更像是一个评论,但也可能是一个答案。)

你确定你需要第二类吗? fromStringM的定义并不依赖StringLike2Primitive实例,它只是简单地包装了它。

fromStringM :: (Monad m, StringLike2Primitive a) => String -> m a
fromStringM a
  | null a = fail "empty string is not allowed"
  | not (isAlphaNumStr aStr) = fail "Only ascii alphanumeric strings are allowed"
  | not (isAsciiStr aStr) = fail "Only ascii strings are allowed"
  | otherwise = return $ fromString a

对于fromText也是fromText

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM