我正在查看过去的考试卷,但不了解如何将Int
转换为[Int]
。
例如,其中一个问题要求我们生成一个除了数字本身和1之外的所有因子的列表。
strictFactors Int -> [Int]
strictFactors x = ???
我不是要求任何人为我做这个问题!我只是想知道如何将整数输入转换为整数输出列表。谢谢!
答案 0 :(得分:4)
或许最容易看一些类似的代码。根据要求,我不会给你答案,但你应该能够用这些想法做你想做的事。
这里我们将使用1
和x
之间的所有数字对来测试我们是否可以将x
作为两个平方数的总和:
sumOfSquares :: Int -> [Int]
sumOfSquares x = [ (a,b) | a <- [1..x], b <- [a..x], a^2 + b^2 == x]
你这样称呼:
ghci> asSumOfSquares 50
[(1,7),(5,5)]
因为50 = 1 ^ 2 + 7 ^ 2且50 = 5 ^ 2 + 5 ^ 2.
您可以将sumOfSquares
视为工作,首先从a
和[1..x]
之间的数字列表1
中获取x
,然后在和x
。然后检查a^2 + b^2 == x
。如果那是真的,它会将(a,b)
添加到结果列表中。
这次让我们生成一些单个数字,然后检查它们是否是另一个的倍数。这将计算最小公倍数(lcm)。例如,15和12的最小公倍数是60,因为它是15和12次表中的第一个数字。
此功能不是您想要的类型,但它使用您想要的所有技术。
lcm :: Int -> Int -> Int
lcm x y = head [x*a | a <- [1..], (x*a) `mod` y == 0]
您可以这样称呼:
ghci> lcm 12 15
60
这次数字列表[1..]
(原则上)是无限的;干得好我们只是用head
选择第一个!
(x*a) `mod` y == 0
会检查x*a
是y
的倍数(mod
会给出除法后的余数)。这是你应该使用的一个关键想法。
使用a <- [1..end]
生成数字,使用True / False表达式(即Bool
)测试它们,可能使用mod
函数。
答案 1 :(得分:2)
我在Haskell上很新,但可以想到将Int转换为包含相同Int的列表的无数方法:
import Control.Applicative (pure)
sane_lst :: Int -> [Int]
sane_lst x = [x]
lst :: Int -> [Int]
lst x = take 1 $ repeat x
lst' :: Int -> [Int]
lst' = replicate 1
lst'' :: Int -> [Int]
lst'' = return
lst''' :: Int -> [Int]
lst''' = pure
lst'''' :: Int -> [Int]
lst'''' x = enumFromTo x x
我想这里的重点是你没有“转换”到一个列表,而是“构建”你需要的列表。您提出的问题的明确策略是找到一些能够根据您的参数为您提供合适的起始列表,然后根据需要进行过滤,折叠或理解的内容。
例如,当我说:
lst x = take 1 $ repeat x
我首先构建一个无限列表,重复传入的值,然后从中获取一个仅包含第一个元素的列表。因此,如果你考虑一下你需要从什么样的列表中找到问题的解决方案,你就会在那里。
答案 2 :(得分:0)
如果您的唯一目标是在类型之间进行转换(现在),则strictFactors x = [x]
是最规范的答案。此函数也称为pure
,因为[]
被称为Applicative
和return
,因为[]
被称为Monad
。