2016-04-21 72 views
1

我是Haskell语言的新手,我在读取函数时遇到了一些问题。 准确地说,我的理解是:Haskell中的读取函数

read "8.2" + 3.8 

应该回到12.0,因为我们要返还相同种类的第二个成员。 我没有得到的东西是为什么:

read "True" || False 

Return True?好吧,它返回与False相同的类型,它是布尔型的,但我不明白为什么第一个成员。我想我有一个模糊的想法,就像在这种情况下返回函数将返回第一个成员,因为条件是|| ? 请帮我一把。另外,如果这只是你们大多数人的基本要求,我很抱歉,但我真的很想说明这一点。

+1

well'True OR anything' ** is **'True';)...(它不*返回第一个成员,而是or操作的结果 - 尝试'读取“True”&& False'如果你喜欢) – Carsten

+0

谢谢!我有同样的想法,只需要有人为我澄清这一点。再次感谢你。 –

+0

np - 我想它和答案一样好,因为可能存在(?) – Carsten

回答

8

在ghci中请跟随!

Prelude> let x = read "True" 
Prelude> :t x 
x :: Read a => a 

所以x没有具体的类型。 x是一种表达方式,当我们要求它时,可以提供一个具体类型的值。我们可以问x是一个IntBool或任何我们想要的。特别是:

Prelude> x :: Bool 
True 

我们也可以问它是一个Int

Prelude> x :: Int 
*** Exception: Prelude.read: no parse 

但它未能成为一体。

所以在你的代码片段中,我们什么时候要求它成为什么东西?

Prelude> :t (||) 
(||) :: Bool -> Bool -> Bool 

功能(||)需要一个Bool,所以它要求它的参数成为Bool秒。正如我们已经看到的,当我们要求x成为Bool时,它将成为Bool的值True。所以说:

Prelude> x || False 
True 

就像是说:

Prelude> True || False 
True 

而且(||)代表the logical OR operation,所以结果是True

+0

非常感谢,我非常感谢您的帮助! –

4

以及True OR anythingTrue

返回的第一个成员,但还是操作的结果

你应该尝试

read "True" && False 

看出差别


也许略有备注/另外:

从某种意义上说,你在那里的权利,它返回第一个组件 - 但仅仅是因为True || _ = True所以即使True || undefined是确定的:

Prelude> read "True" || undefined 
True 
+0

哦,好吧,我对读取功能有所错误。再次感谢你。 –