gpt4 book ai didi

haskell - 在 Haskell 中解构元组时,可以在哪里使用元素?

转载 作者:行者123 更新时间:2023-12-04 13:21:45 25 4
gpt4 key购买 nike

我正在阅读使用以下示例的教程(我将对其进行概括):

f :: Foo -> (Int, Foo)
...
fList :: Foo -> [Int]
fList foo = x : fList bar
where
(x, bar) = f foo

我的问题在于,您似乎可以引用 xbar ,按名称,在获得它们的元组之外。如果我的猜测是正确的,这似乎就像在其他语言中解构参数列表一样。 (换句话说,我不必执行以下操作:)
fList foo = (fst tuple) : fList (snd tuple)
where
tuple = f foo

我对这种行为是否正确?我从未在我一直在阅读的教程/书籍中看到它。有人可以指出有关该主题的更多信息吗?

编辑 : 可以用类似的方式解构任何东西(列表、数组等),还是只能用元组来解构?

最佳答案

看到你的编辑,我想你问的是Pattern matching .
并回答您的问题:是的,您可以构造任何东西,您也可以使用构造函数“解构”。例如,您可能熟悉这种形式的模式匹配:

head :: [a] -> a
head (x:xs) = x
head [] = error "Can't take head of empty list"
但是,还有更多可以使用模式匹配的地方,其他有效的符号是:
head xs = case xs of
(y:ys) -> y
[] -> error "Can't take head of empty list"

head xs = let (y:ys) = xs
in y

head xs = y
where
(y:ys) = xs
请注意,最后两个示例与第一个示例有点不同,因为当您使用空列表调用它们时,它们会给出不同的错误消息。

尽管这些示例特定于列表,但您可以对其他数据类型执行相同操作,如下所示:
first :: (a, b) -> a
first tuple = x
where
(x, y) = tuple

second :: (a, b) -> b
second tuple = let (x, y) = tuple
in y

fromJust :: Maybe a -> a
fromJust ma = x
where
(Just x) = ma
同样,如果您使用 Nothing 调用最后一个函数,它也会崩溃。 .
总结一下;如果您可以使用构造函数创建某些东西(例如 (:)[] 用于列表,或 (,) 用于元组,或 NothingJust 用于 Maybe),您可以使用这些相同的构造函数在多种方式。

关于haskell - 在 Haskell 中解构元组时,可以在哪里使用元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com