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

Unit testing 测试自定义数据类型的haskell io,unit-testing,haskell,error-handling,monads,Unit Testing,Haskell,Error Handling,Monads,更新:我注意到我的代码设计中存在问题。我的代码的整体结构已经发生了很大的变化,因此对这个问题的任何回答都或多或少与其当前状态无关。但是这么说,最好不要删除已回答的问题,所以我保留这个问题 我的代码的问题是类型类对于我想要做的事情来说太泛型了。现在我专注于编写函数,比如 makeModelId::String->StringValueError ModelId 然后用如下方式扩展: makeModelIdM::(Monad m)=>String->m(StringValueError Model

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

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

makeModelId::String->StringValueError ModelId
然后用如下方式扩展:

makeModelIdM::(Monad m)=>String->m(StringValueError ModelId)
makeModelIdM astr=do
idstr(这更像是一个评论,但也可能是一个答案。)

你确定你需要第二种类型的课程吗?
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

我想也是这样,因为我还有另外两种数据类型,它们是根据重叠条件从字符串中读取的。我使用诸如
makeModelIdM::(Monad m)=>String->m ModelId
之类的函数来控制它们的生产。不过,我不确定这是否是最好的办法。我是否应该尝试测试
makeModelId