如何在Haskell中添加而不必使用算术运算符?

如何在Haskell中添加而不必使用算术运算符?,haskell,Haskell,我是Haskell的新手,我正在尝试找出如何在不使用“+”符号的情况下进行添加。我使用Winhugs作为编译器 比方说, 饼干=10块,巧克力=5块,蛋糕=20块 如果我进去 饼干1巧克力1 产出应该是, 十五 这是我的 cookies :: Int -> Int cookies 1 = 10 cookies n = 10 + cookies (n-1) chocolate :: Int -> Int chocolate 1 = 5 chocolate n = 5 + chocol

我是Haskell的新手,我正在尝试找出如何在不使用“+”符号的情况下进行添加。我使用Winhugs作为编译器

比方说, 饼干=10块,巧克力=5块,蛋糕=20块

如果我进去

饼干1巧克力1

产出应该是,

十五

这是我的

cookies :: Int -> Int
cookies 1 = 10
cookies n = 10 + cookies (n-1)

chocolate :: Int -> Int
chocolate 1 = 5
chocolate n = 5 + chocolate (n-1)
我必须进去

饼干1+巧克力1

为了得到15。还有别的办法吗

我也尝试过使用递归类型,但我仍然发现它非常混乱。我也尝试过这个,但我只能添加两个项目,而且我总是需要输入cookies:

cookies ::  Int -> (Int -> Int) -> Int -> Int 
cookies x item y = (x * 20) + item y

cake :: Int -> Int
cake 1 = 20
cake n = 20 + cake (n-1)

chocolate :: Int -> Int
chocolate 1 = 5
chocolate n = 5 + chocolate (n-1)
此外,我不能只输入cookies,因为它应该始终带有另一项

曲奇1

错误-找不到以下项的“显示”功能:

***表达式:cookies 1

***类型:(Int->Int)->Int->Int

我很抱歉这个问题。谢谢所有能帮忙的人

**更新**
我知道我可以使用不同的编译器,但这是学校教的,也是我们项目需要使用的编译器:(

我不明白你为什么想要所有这些。你试图实现的是所谓的。Haskell并不真正支持这些,而且我真的不相信在你的应用程序中使用它们是有意义的。cookies 1+chocolate 2有什么错

也就是说,Haskell 2010/GHC Haskell型系统具有足够的灵活性,可以将可变函数组合在一起:

{-# LANGUAGE TypeFamilies, FlexibleInstances #-}

class Crumbles c where
  crumble :: Int -> c
instance Crumbles Int where
  crumble = id
instance (f ~ (Int -> Int), i ~ Int, Crumbles c) => Crumbles (f -> i -> c) where
  crumble acc f i = crumble $ f i + acc
现在你可以做了

cookies :: Crumbles c => Int -> c
cookies n = crumble $ n*10

chocolate :: Crumbles c => Int -> c
chocolate n = crumble $ n*5

goodies :: [Int]
goodies = [ cookies 1  -- 10
          , cookies 1 chocolate 1   -- 15
          , cookies 1 chocolate 1 cookies 100000  -- 1000015
          ]

main :: IO ()
main = print goodies
…给出
[10,151000015]

我不知道Hugs是否支持等式约束所需的
TypeFamilies
扩展
f~(Int->Int)
I~Int



我怀疑任务的目的是完全不同的,即如何在不使用加法或乘法的情况下实现
cookies::Int->Int
,即不编写
*10
10+cookies(n-1)
。他们可能想要的答案应该只使用和
pred
函数(分别相当于
+1
-1

不要尝试编写名为
cookies
chocolate
的函数,当输入hugs解释器时,它们的行为就是这样的

相反,请尝试编写一个
IO
操作,该操作接受输入、解析输入并执行适当的计算。您可能喜欢
interactive
函数,它在
String
s上执行函数,并在用户键入的内容上运行该函数:

interact :: (String -> String) -> IO ()
例如,对于runhaskell(非常类似于hugs),以下代码:

main = interact $ \s ->
    "What is your name?\n" ++
    filter (/='\n') s ++ ", nice to meet you!\n"
生成以下交互:

% runhaskell test.hs
What is your name?
Daniel
Daniel, nice to meet you!

请注意,我在键入
Daniel
并按enter键后按下了EOF按钮;在Linux上这是ctrl-d,但我相信在Windows上它是ctrl-z。还要注意,代码中没有对
Daniel
的定义——我键入的
Daniel
不是Haskell术语,而是通过运行Haskell读取的输入术语
main

与Daniel Wagner一样,我怀疑这个问题被误导了。我发现很难相信任务要求函数
cookies
chocolate
,它们可以以这种方式组合。相反,它可能要求函数
calculate::String->Int
,它接受string
“cookies 1巧克力2”
,对其进行解析并返回结果

因此,解决方案非常简单,所以我不会泄露。将问题分解为如下小步骤:

  • “饼干1巧克力2”

  • [“饼干”、“1”、“巧克力”、“2”]

  • [(“饼干”,1),(“巧克力”,2)]

  • [10,10]

  • 20


为每一步写一个函数,一个<代码>主< /代码>,要求输入并调用这些函数来计算最终结果。如果考虑如何使用<代码>也许< <代码> > <代码>,以处理输入中的错误,例如未知项、非数值量、缺失量,以及C.</P> WHUHGS,则是加分。ASE考虑使用一个更现代的编译器GHC,为了更全面的体验,你可以使用我,但是它是我们在学校被教用的编译器:(@Mel可能是这样,但很明显,你正在进入学校课程未涵盖的领域,拥抱可能根本不可行。事实上,拥抱是否有意义仍有争议……你应该使用GHC,学校里没有人会介意你这么做。他们可能只是认为拥抱更容易。T他更像是一种领域特定语言(DSL),而不是一个函数。嗨!谢谢你的回答!“cookies 1+巧克力2有什么问题”我的教授对东西非常具体,他希望我们做cookies 1巧克力2:(我尝试了您键入的内容,但遗憾的是hugs不支持该扩展。感谢您的帮助!呃。这是一个荒谬的要求!但是,现在您有了一个残废的解决方案,允许使用准确的语法

cookies 1巧克力1
(但没有其他)也适用于拥抱,还有一个可笑的typeclass黑客解决方案,它允许任何形式的
崩溃a崩溃b…崩溃ω
。让他们选择…@Mel,这看起来是一个非常不寻常的要求。仔细检查作业,因为要求
cookies 1 chacolate 2
工作似乎不合理。也许是教授sor忘记了
+
?如果可能的话,我会写信给教授并要求确认。从教学的角度来看,这似乎是一个毫无意义的练习,因为它的解决方案需要滥用打字班机制,这不是应该教的。@chi是的,我再次检查了,这就是他要求的。我不知道