如何在haskell中正确定义空字符串?

bel*_*lla 4 string haskell functional-programming function list

我的程序有问题,我能够找出问题所在.我设法将它减少到这个更简单的问题.让我们说我有这个功能

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"
Run Code Online (Sandbox Code Playgroud)

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

fn ""
Run Code Online (Sandbox Code Playgroud)

我得到了非详尽的模式错误.因为""被认为是一个空列表,[]它不应该与我的第一个模式匹配并返回"empty"

Sim*_*ser 9

StringHaskell中的A 是一个字符列表.所以要匹配空,String你需要匹配一个空列表([]).您的模式(x:xs)将仅匹配列表或String至少包含一个元素的s,因为它由一个元素(x)和其余(xs)组成,它们可以为空或非空.

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

fn :: String -> String
fn [] = "empty"
fn (x:xs) = "hello"
Run Code Online (Sandbox Code Playgroud)

这将返回"empty"fn "".

  • 当然,空的_string literal_`""`也可以用在模式中,这个函数可以写成`fn""="empty"; fn _ ="你好"`. (5认同)

Don*_*art 7

你的功能

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"
Run Code Online (Sandbox Code Playgroud)

会写得更好:

fn :: String -> String
fn x | null x    = "empty"
     | otherwise = "hello"
Run Code Online (Sandbox Code Playgroud)

要么

fn :: String -> String
fn "" = "empty"
fn _  = "hello"
Run Code Online (Sandbox Code Playgroud)

因为null (x:xs)肯定是错的(总是假的).

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

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