我开始使用Haskell,我试图定义一个带一个数字的阶乘函数,如果这个数字是负数,结果就不会显示任何结果。像这样(只是一个例子):
*Main> factorial 8
40320
*Main> factorial (-1)
*Main>有可能吗?怎么可能?
谢谢。
发布于 2014-08-12 18:35:46
如果您想保持它的纯正性,那么您可以通过定义一个新的结果类型并定义show来转换为空字符串,如果结果无效的话:
data FactResult = R Integer | Invalid
instance Show FactResult where
show (R i) = show i
show Invalid = ""
factorial n | n < 0 = Invalid
factorial n = R $ product [1..n]发布于 2014-08-12 18:37:32
你不能仅仅用一个函数来做这件事,无论如何,这可能不是你想要的。函数总是必须返回一些东西,即使它只是一个表示没有有效结果的虚拟值!这很有用,因为它意味着您的函数的结果总是可以被程序的其他部分所使用--所有的东西都是更可组合的。
通常的惯用解决方案是使用Maybe类型,它允许您返回Just结果或Nothing
factorial n | n < 0 = Nothing
| n < 2 = Just 1
| otherwise = ...如果您真的希望您的行为在GHCi中,您可以打印出您想要的结果,而不是直接返回它。这使您能够更好地控制输出的外观,但这意味着您无法直接重用函数的结果。你可以这样做:
factorialPrint n | n < 0 = return () -- an IO action that does nothing
| otherwise = print (factorial n)这个函数不是生成结果,而是生成一个IO操作。然后,GHCi执行此操作,不打印任何本身,这意味着您必须自己显式地打印结果。
发布于 2014-08-12 18:36:26
做这种事情的“正确”方法可能是使用。
factorial n
| n < 0 = Nothing
| n == 1 = Just 1
| otherwise = fmap (*n) $ factorial (n-1)它输出“只要n!”否则,输入任何>= 0和"Nothing“。
如果你真的想要一个空白的答复。
maybeStr Nothing = ""
maybeStr (Just x) = show x然后运行打印,你会说:
f = putStrLn . maybeStr . factorial
f 4 -- would print 24
f (-1) -- would print blank linehttps://stackoverflow.com/questions/25271508
复制相似问题