Lyn*_*dra 3 haskell types list
因此,在练习中,我会得到一个类似的列表["xyz", True, 42].问题是,这是否是Haskell中的有效表达式以及该表达式的类型.
列表只能容纳同质的类型,但类型"xyz"是[Char],类型TrueIS Bool和的类型42是Num p => p.这是不同的类型,所以我不能把它们列入一个列表.
那正是我所想.但是这个练习的答案是"是的,它是一个有效的表达式.显示实例!".
为什么它是一个有效的表达式,虽然列表元素的类型不同,show-instance是什么意思?我正在考虑类似于面向对象语言的超类,但我认为这不是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
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 语法:语法上没有任何错误,它只在编译器的下一个阶段:类型检查等,它会引发错误,因为语法是荒谬的.