首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell -如何在GHCi中不显示任何结果?

Haskell -如何在GHCi中不显示任何结果?
EN

Stack Overflow用户
提问于 2014-08-12 18:27:44
回答 4查看 349关注 0票数 1

我开始使用Haskell,我试图定义一个带一个数字的阶乘函数,如果这个数字是负数,结果就不会显示任何结果。像这样(只是一个例子):

代码语言:javascript
复制
    *Main> factorial 8
    40320
    *Main> factorial (-1)
    *Main>

有可能吗?怎么可能?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-12 18:35:46

如果您想保持它的纯正性,那么您可以通过定义一个新的结果类型并定义show来转换为空字符串,如果结果无效的话:

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2014-08-12 18:37:32

你不能仅仅用一个函数来做这件事,无论如何,这可能不是你想要的。函数总是必须返回一些东西,即使它只是一个表示没有有效结果的虚拟值!这很有用,因为它意味着您的函数的结果总是可以被程序的其他部分所使用--所有的东西都是更可组合的。

通常的惯用解决方案是使用Maybe类型,它允许您返回Just结果或Nothing

代码语言:javascript
复制
factorial n | n < 0     = Nothing
            | n < 2     = Just 1
            | otherwise = ...

如果您真的希望您的行为在GHCi中,您可以打印出您想要的结果,而不是直接返回它。这使您能够更好地控制输出的外观,但这意味着您无法直接重用函数的结果。你可以这样做:

代码语言:javascript
复制
factorialPrint n | n < 0     = return () -- an IO action that does nothing
                 | otherwise = print (factorial n)

这个函数不是生成结果,而是生成一个IO操作。然后,GHCi执行此操作,不打印任何本身,这意味着您必须自己显式地打印结果。

票数 9
EN

Stack Overflow用户

发布于 2014-08-12 18:36:26

做这种事情的“正确”方法可能是使用。

代码语言:javascript
复制
factorial n
    | n < 0     = Nothing
    | n == 1    = Just 1
    | otherwise = fmap (*n) $ factorial (n-1)

它输出“只要n!”否则,输入任何>= 0和"Nothing“。

如果你真的想要一个空白的答复。

代码语言:javascript
复制
maybeStr Nothing  = ""
maybeStr (Just x) = show x

然后运行打印,你会说:

代码语言:javascript
复制
f = putStrLn . maybeStr . factorial
f 4 -- would print 24
f (-1) -- would print blank line
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25271508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档