Haskell:函数获取几种类型的变量

时间:2013-11-14 18:55:39

标签: haskell

我必须创建一个函数,它能够获得两种类型的变量作为String或[Int]的输入。

这是我的工作。它将列表列表作为参数,并检查所有列表是否具有相同的长度。如果是,则显示(m,n)其中m是List具有的列表数,n是所有列表的长度(相同)。

size :: [[Int]] -> (Int,Int)
size a = size2 a m n
  where
  m = 0
  n = length (head a)

size2 :: [[Int]] -> Int -> Int -> (Int,Int)
size2 [] m n = (m,n)
size2 a m n
    |  n == length (head a) = size2 (tail a) (m+1) n
    |  otherwise = (0,0)

我使用[[Int]],它必须不在[String]输入上工作。

3 个答案:

答案 0 :(得分:3)

答案是将类型签名更改为

size :: [[a]] -> (Int,Int)size2 :: [[a]] -> Int -> Int -> (Int,Int)

但也有更好的方法来制作此功能,而不是自己使用size2浏览列表,您可以使用Prelude

中的函数

如何做到这一点的一个很好的例子是:

size :: [[a]] -> (Int, Int)
size [] = (0,0)
size ls@(x:xs) = 
    if all (\s -> length x == length s) xs 
        then (length ls, length x) 
        else (0,0)

这就是说:如果所有列表的大小与第一个列表相同,则返回tuple,否则返回(0,0)

这是有效的,但是如何区分空列表和没有相同大小的所有列表的列表?我们使用Maybe

size :: [[a]] -> Maybe (Int, Int)
size [] = Just (0,0)
size ls@(x:xs) = 
    if all (\s -> length x == length s) xs 
        then Just (length ls, length x) 
        else Nothing

*Main> size []
Just (0,0)
*Main> size ["gola","asda"]
Just (2,4)
*Main> size ["gola","asda","s"]
Nothing

答案 1 :(得分:1)

size的类型签名应为size :: [[a]] -> (Int, Int)。这里a是类型变量,可以是任何类型。

这是[[Int]] -> (Int, Int)[String] -> (Int, Int)的概括,因为String与字符列表[Char]相同。

当然,您必须相应地更改size2的类型。

作为旁注,最好将定义更改为返回Maybe (Int, Int)类型,这样您就可以区分不同的情况[],例如[[1],[2,3]]

答案 2 :(得分:0)

如何制作满足您需求的自定义数据类型?

data Either a b = Left a | Right b
type CharsOrInts = Either [Char] [Int]

现在你可以模式匹配了:

size Left x = foo x
size Right x = bar x

这样foo :: String - > YourOutputType,bar :: [Int] - > YourOutputType