解释为什么具有不同类型的列表是需要的有效Haskell表达式

Lyn*_*dra 3 haskell types list

因此,在练习中,我会得到一个类似的列表["xyz", True, 42].问题是,这是否是Haskell中的有效表达式以及该表达式的类型.

列表只能容纳同质的类型,但类型"xyz"是[Char],类型TrueIS Bool和的类型42是Num p => p.这是不同的类型,所以我不能把它们列入一个列表.

那正是我所想.但是这个练习的答案是"是的,它是一个有效的表达式.显示实例!".

为什么它是一个有效的表达式,虽然列表元素的类型不同,show-instance是什么意思?我正在考虑类似于面向对象语言的超类,但我认为这不是Haskell的工作方式.

Wil*_*sem 6

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

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
Run Code Online (Sandbox Code Playgroud)

(这里我使用Python的真实性来转换为Integer和String文字)

然后我们可以用OverloadedStringspragma 编写它:

{-# LANGUAGE OverloadedStrings #-}

the_list = ["xyz", True, 42]
Run Code Online (Sandbox Code Playgroud)

这相当于:

Prelude Data.String> ["xyz", True, 42]
[True,True,True]
Run Code Online (Sandbox Code Playgroud)

但是请注意,该列表仍然仅包含BoolS,我们只发Bool的一个实例IsString,并Num让我们能够字符串转换文字和数字文字,以Bool秒.

在Haskell中不可能列出异构类型,并且由于默认情况下a Bool不是a Num,因此我们无法在不添加额外魔法的情况下解析该表达式.

另一个注意事项是它是有效的Haskell 语法:语法上没有任何错误,它只在编译器的下一个阶段:类型检查等,它会引发错误,因为语法是荒谬的.

  • @Lyndra:我同意它做了很多假设和特定的编译器功能,所以我个人会说问题的答案是*不,表达式无效*,但当然可以开始挑剔. (3认同)
  • @Lyndra事实上,在CS课程期间,不应期望您在这个详细程度上学习Haskell.我希望,在CS课程中,预期的答案是"不,不能打字",正如Willem所说.你应该问你的导师这个 - 也许你误解了问题/答案,或者他们只是写错了答案:) (2认同)