我必须创建一个函数,它能够获得两种类型的变量作为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]输入上工作。
答案 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