gpt4 book ai didi

list - 解释为什么不同类型的列表是一个有效的 Haskell 表达式

转载 作者:行者123 更新时间:2023-12-01 10:24:36 26 4
gpt4 key购买 nike

所以在练习中,我得到了一个列表,如 ["xyz", True, 42]。问题是这是否是 Haskell 中的有效表达式以及该表达式的类型是什么。

列表只能包含同质类型,但是"xyz"的类型是[Char]True的类型是Bool 并且42 的类型是Num p => p。那是不同的类型,所以我无法将它们放入列表中。

我是这么想的。但对该练习给出的答案是“是的,这是一个有效的表达式。显示实例!”

为什么它是一个有效的表达式,尽管列表元素的类型不同,show-instance 是什么意思?我正在考虑面向对象语言的父类(super class)之类的东西,但我认为这不是 Haskell 的工作方式。

最佳答案

如果允许我们定义更多上下文,我们可以使它成为一个有效的表达式,例如:

import Data.String(IsString(fromString))

instance IsString Bool where
fromString [] = False
fromString _ = True

instance Num Bool where
(+) = (||)
(*) = (&&)
abs = id
signum = id
fromInteger 0 = False
fromInteger _ = True
negate = not

(这里我使用 Python 的真实性从 IntegerString 文字转换)

然后我们可以用OverloadedStrings来写它用法:

{-# LANGUAGE OverloadedStrings #-}

the_list = ["xyz", True, 42]

这将等同于:

Prelude Data.String> ["xyz", True, 42]
[True,True,True]

但请注意,该列表仍然只包含 Bool s,我们只做了Bool IsString 的实例和 Num使我们能够将字符串 literals 和数字 literals 转换为 Bool

在 Haskell 中不可能存在异构类型列表,因为默认情况下是 Bool不是 Num ,因此我们无法在不添加一些额外魔法的情况下解析该表达式。

另外要注意的是,它是有效的 Haskell 语法:语法上没有错,只是在编译器的下一阶段:类型检查等,它会引发错误,因为语法毫无意义

关于list - 解释为什么不同类型的列表是一个有效的 Haskell 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48670614/

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