haskell - 如何使用 Haskell 类型来重载方法

标签 haskell

我正在做一个小项目,我正在尝试学习 Haskell 并编写一个程序来帮助规划学生的日程安排。我有以下类型:

data Course =
    { id :: Int, title :: String }
    deriving (Eq, Show)

data Req = Single Course
    | Any [Req]
    | All [Req]
    deriving Show

现在我想写一个方法:

satisfies :: [Course] -> Req -> Bool

但是我不知道应该如何使用有关 Req 的信息来重载该函数。我应该如何进行?

最佳答案

首先,一些错别字:

data Course = Course { 
   id :: Int, 
   title :: String 
   } deriving (Eq, Show)

请注意添加的数据构造函数名称(“Course”)以及从“derives”更改为“deriving”。

data Req = Single Course
    | Any [Req]
    | All [Req]
    deriving Show

这里也一样。

satisfies :: [Course] -> Req -> Bool

将类型从[类(class)]更改为[类(class)]。

course1 = Course 1 "One"
course2 = Course 2 "Two"
course3 = Course 3 "Three"
course4 = Course 4 "Four"
course5 = Course 5 "Five"

req1 = Single course2
req2 = Any [Single course2, Single course3, Single course5]
req3 = All [Single course1, Single course2]
req4 = Any [req2, req3]
req5 = All [req4, req1]

一些测试数据。

satisfies cs (Single c) = c `elem` cs

符合单一类(class)要求。另外两个的美妙之处在于它们的简单性,因为它们所做的大部分工作都已经在 Prelude 中定义了,您可以像英语一样阅读它们:

satisfies cs (Single c) = c `elem` cs
satisfies cs (Any reqs) = any (satisfies cs) reqs
satisfies cs (All reqs) = all (satisfies cs) reqs

以下是您 friend anyall 的类型签名:

any :: (a -> Bool) -> [a] -> Bool
all :: (a -> Bool) -> [a] -> Bool

它们都采用 bool 函数并对列表中的每个成员进行测试。由于我们已经获得了要求列表和测试函数(它满足递归使用并部分应用于所免除的类(class)),因此我们可以直接使用它们。

让我们测试一下:

*TestSO15213421> satisfies [course1] req1
False
*TestSO15213421> satisfies [course2] req1
True
*TestSO15213421> satisfies [course1, course2] req1
True
*TestSO15213421> satisfies [course1, course2] req1
True
*TestSO15213421> satisfies [course1, course2] req3
True
*TestSO15213421> satisfies [course1, course3] req3
False
*TestSO15213421> satisfies [course1, course3] req2
True
*TestSO15213421> satisfies [course4] req2
False
*TestSO15213421> satisfies [course4] req5
False
*TestSO15213421> satisfies [course5] req2
True
*TestSO15213421> satisfies [course4] req4
False
*TestSO15213421> satisfies [course2] req4
True
*TestSO15213421> satisfies [course2, course3] req4
True
*TestSO15213421> satisfies [course5, course3] req4
True
*TestSO15213421> satisfies [course5, course3] req5
False

一切都符合预期。

关于haskell - 如何使用 Haskell 类型来重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213421/

相关文章:

haskell - 使用 endOfInput 解析器输入不完整

arrays - 行星模拟的“Repa”性能

haskell - 如何将数据类型带入值(value)级别?

arrays - 如何从函数创建 Haskell 数组

haskell - Haskell 中的类型条件控制

haskell - 理解涉及 Left、Right 和 case 语句的示例

arrays - Haskell 中令人费解的内存行为

haskell - 递归排序非连续列表到连续列表列表

haskell - 标量乘法与 Haskell 中的新 Matrix 类型

haskell - 为什么我的函数的无点版本使用更多的内存