dar*_*ton 0 polymorphism haskell types
所以基本上我已经过去一个月前学习这部分了,我可以做更复杂的事情,但我还是不明白我的类型定义中需要"Ord"或"Eq"等.当我在网上查看它时,由于某种原因,它让我感到困惑.
例如
my_min :: Ord a => a -> a -> a
my_min n1 n2 = if n1<n2 then n1 else n2
Run Code Online (Sandbox Code Playgroud)
为什么这需要Ord?你能举例说明你何时需要Eq(非常简单)?我需要一个非常清楚,基本的解释,说明何时需要放置这些,需要注意什么,以及如何尽可能避免使用这些.
通常我只需要"[Int] - > Int - > [Int]"之类的东西,所以我知道这个函数需要一个整数列表和一个整数,并返回一个整数列表.但当它包括Eq或Ord时我不知道.
我在讲座中发现的关于找到两个列表的相同的Eq类型怎么样,它是如何应用的?
identical :: Eq a =>[a]->[a]->Bool
identical [] [] = True
identical [] _ = False
identical _ [] = False
identical (h1:t1) (h2:t2) =
if h1==h2
then (identical t1 t2)
else False
Run Code Online (Sandbox Code Playgroud)
谢谢.
Ord暗示事物可以被命令,这意味着你可以说比a它更小(或更大)b.使用只是Eq说:我知道这两个项目不一样,但我不能说哪一个更大或更小.例如,如果您将红绿灯作为数据类型:
data TLight = Red | Yellow | Green deriving (Show, Eq)
instance Eq TLight where
Green == Green = True
Yellow == Yellow = True
Red == Red = True
_ == _ = False
Run Code Online (Sandbox Code Playgroud)
现在我们可以说:Red是不平等Yellow但我们不能说更重要的是什么.这就是为什么你不能使用TLight你的原因my_min.你不能说哪一个更大.
你的第二个问题:"有没有,你必须使用任何情况下,Eq与Ord?":
Ord 暗示 Eq.这意味着如果可以订购类型,您也可以检查它是否相等.
你说你已经处理了很多[Int] -> Int -> [Int],然后你知道它需要一个整数列表和一个整数并返回一个整数.现在,如果你想要概括你的功能,你必须问自己:我想在我的功能中使用的可能类型是否需要任何特殊功能?就像他们必须能够被命令或等同.
让我们举几个例子:假设我们想要编写一个函数,它接受一个类型列表a和一个类型的元素,a并返回带有consed元素的lisy.它的签名样式怎么样?让我们简单地说:
consfunc :: [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)
我们还需要更多功能吗?没有!我们的类型a可以是任何东西,因为我们不需要它可以简单地订购,因为这是我们的功能应该做的.
现在如果我们想要一个列表和一个元素并检查该元素是否已经在列表中呢?开始类型签名是:
elemfunc :: [a] -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
现在我们的元素必须能够做一些特别的事吗?是的,我们必须能够检查它是否等于列表中的任何元素,这表示我们的类型a必须是等同的,所以我们的类型签名如下所示:
elemfunc :: (Eq a) => [a] -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
现在,如果我们想要一个列表和一个元素并在它小于第一个元素时插入它,该怎么办?你能猜出类型签名会是什么样子吗?
让我们再次从标准开始并问自己:我们需要的不仅仅是知道元素和列表必须是相同的类型:是的,因为我们的条件需要执行一个需要我们的类型订购的测试,我们必须Ord在我们的类型签名中包含:
conditionalconsfunc :: (Ord a) => [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)
那么你想看看两个列表是否相同,所以有两件事需要注意:
您的列表必须包含相同的类型,列表中的内容必须是等同的,因此Eq.
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |