[a] -> [a] -> [a]"和 "[a] -> [a] -> [a]"有什么区别-6ren"> [a] -> [a] -> [a]"和 "[a] -> [a] -> [a]"有什么区别-我是 Haskell 新手。谁能解释一下 Ord a 的区别和用法吗? 现在我熟悉了 [a] -> [a] -> [a] 的事情。但这, Ord a => [a] -> [a] -> [a] 请详细解-6ren">
gpt4 book ai didi

list - "Ord a => [a] -> [a] -> [a]"和 "[a] -> [a] -> [a]"有什么区别

转载 作者:行者123 更新时间:2023-12-02 19:54:19 24 4
gpt4 key购买 nike

我是 Haskell 新手。谁能解释一下 Ord a 的区别和用法吗?

现在我熟悉了 [a] -> [a] -> [a] 的事情。但这,

Ord a => [a] -> [a] -> [a]

请详细解释一下。

最佳答案

区别在于约束,Ord a => a 这里 a 具有类型 a 但不是任何 a,一个 a,它是 Ord 类型类的实例,例如:

这里我稍微改变一下类型结果,只是为了展示您可以使用该接口(interface)的功能:

canBeOrderedList :: Ord a => [a] -> [a] -> [Bool]
canBeOrderedList xs ys = zipWith (>) xs ys

这里你可以做任何你想要的通用函数,这里的a不受限制,所以它可以是OrdEq或两者都或无,可以是函数,可以是整数,可以是任何东西

anyListTypeConcat :: [a] -> [a] -> [a]
anyListTypeConcat xs ys = xs ++ ys

所以:

anyListTypeConcat [True, False] [False, True]
=> [True,False,False,True]

在这里您连接了两个列表,到目前为止一切顺利,在这里:

canBeOrderedList [1,2,3] [4,1,2]
=> [False,True,True]

您可以将 (>) 与数字一起使用,但是,怎么样:

data Some = A | B | C deriving (Eq, Show)

anyListTypeConcat [A, A] [B, C]
=> [A,A,B,C]

但是:

canBeOrderedList [A,A,B] [C,A,A]
error:
• No instance for (Ord Some)
arising from a use of ‘canBeOrderedList’
• In the expression: canBeOrderedList [A, A, B] [C, A, A]
In an equation for ‘it’: it = canBeOrderedList [A, A, B] [C, A, A]

您无法对该列表进行排序,但如果您更改数据类型,则可以:

data Some = A | B | C deriving (Eq, Show, Ord)
canBeOrderedList [A,A,B] [C,A,A]
=> [False,False,True]

这就是本质上的区别

关于list - "Ord a => [a] -> [a] -> [a]"和 "[a] -> [a] -> [a]"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57414879/

24 4 0
文章推荐: html - 同一
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com