【发布时间】:2013-01-04 08:02:02
【问题描述】:
我正在编写小型“hello world”类型的程序,它通过不同的“原因”对相同的文件进行分组,例如相同的大小、相同的内容、相同的校验和等。
所以,我已经到了要编写这样一个函数的地步(DuplicateReason 是一种代数类型,它说明了两个文件相同的原因):
getDuplicatesByMethods :: (Eq a) => [((FilePath -> a), DuplicateReason)] -> IO [DuplicateGroup]
在每个元组中,第一个函数将是通过文件路径返回某些 (Eq a) 值的函数,例如字节串(带有内容),或带有校验和的 Word32,或带有大小的 Int。
显然,Haskell 不喜欢这些函数的类型不同,所以我需要以某种方式收集它们。
我看到它创建类型的唯一方法
data GroupableValue = GroupString String | GroupInt Int | GroupWord32 Word32
然后让生活更轻松,使 typeclass 像
class GroupableValueClass a where
toGroupableValue :: a -> GroupableValue
fromGroupableValue :: GroupableValue -> a
并为我要获得的每个值实现实例。
问题:我做得对吗?(如果没有)有没有更简单的方法来解决这个任务?
更新:
这是描述我想要什么的完整最小代码(简化,没有 IO 等):
data DuplicateGroup = DuplicateGroup
-- method for "same size" -- returns size
m1 :: String -> Int
m1 content = 10
-- method for "same content" -- returns content
m2 :: String -> String
m2 content = "sample content"
groupByMethods :: (Eq a) => [(String -> a)] -> [DuplicateGroup]
groupByMethods predicates = undefined
main :: IO ()
main = do
let groups = (groupByMethods [m1, m2])
return ()
【问题讨论】:
-
我不确定您所说的
Haskell doesn't like that these functions are of different types是什么意思。你能引用你得到的错误吗?
标签: haskell