4

我的程序有问题,我能够隔离问题。我设法将其简化为这个更简单的问题。可以说我有这个功能

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"

输入随机的东西会返回"hello",但如果我这样做了,

fn ""

我得到了非详尽的模式错误。由于 "" 假设是一个空列表,[]它不应该与我的第一个模式匹配并返回"empty"吗?

4

2 回答 2

11

Haskell 中的AString是一个字符列表。因此,要String匹配空列表,您需要匹配一个空列表 ( [])。您的模式(x:xs)将只匹配String具有至少一个元素的列表或 s,因为它由一个元素 ( x) 和其余元素 ( ) 组成,这些元素xs可以是空的或非空的。

您的函数的工作版本如下所示:

fn :: String -> String
fn [] = "empty"
fn (x:xs) = "hello"

这将返回"empty".fn ""

于 2012-07-14T20:17:07.903 回答
8

你的功能

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"

最好写成:

fn :: String -> String
fn x | null x    = "empty"
     | otherwise = "hello"

或者

fn :: String -> String
fn "" = "empty"
fn _  = "hello"

因为null (x:xs)肯定是错误的(总是 False)。

我更喜欢后者,因为它清楚地表明您只关心 String 类型。

这是一个有点奇怪的功能。我没有在实践中看到它。

于 2012-07-14T23:08:52.717 回答