Haskell:猪拉丁

问题描述 投票:0回答:4

问题:翻译成“拉丁猪”的简单规则是,以一个以元音开头的单词加上“ yay”,同时将一个或多个辅音开头的任何单词转移到后面附加“ ay”。例如,“ able”变为“ ableyay”,“ stripe”变为“ ipestray”。编写一个将一串字母转换成其Pig-Latin翻译的函数。

实施:

-- define function to detect vowel
isVowel :: Char -> Bool
isVowel c = elem c ['u','e','o','a','i']


-- define function Latin Pig
lp ::String -> String
lp str = if (isVowel (head str)) then do {str ++ "yay"} 
         else
            do {

                str ++ (head str)
                tail str
                lp str

                }   

问题:到目前为止,我的代码(逻辑)没有任何问题。老实说,这是我参加Haskell入门课程的作业。但是编译器给我错误:

**Couldn't match expected type `t0 -> t1 -> t2 -> t3 -> [Char]'
                with actual type `Char'
    Expected type: [t0 -> t1 -> t2 -> t3 -> [Char]]
      Actual type: String
    In the first argument of `head', namely `str'
    In the second argument of `(++)', namely
      `(head str) tail str lp str'
Failed, modules loaded: none.**

我的代码怎么了?!

haskell apache-pig
4个回答
7
投票

首先,请考虑模式匹配。可以将任何非空列表定义为x:xs,其中,x作为头列表xs作为尾部列表

然后您的代码变为,

-- define function Latin Pig
lp :: String -> String
lp [] = ""
lp (x:xs) = if (isVowel x) then str ++ "yay"
            else ..... -- fill here
                where str = (x:xs)   

不要忘记,运算符是list的构造函数,例如,'a':“ bab” =>“ abab”

请注意,字符串是char的列表。此外,您可以跳过上一个示例中的where子句,例如,>

-- define function Latin Pig
lp :: String -> String
lp [] = ""
lp str@(x:xs) = if (isVowel x) then str ++ "yay"
                else ..... -- fill here

应该足以帮助您。祝你好运


2
投票

请参考以下代码。


1
投票

这是猪拉丁规则的另一种方式:


1
投票

我不确定使用递归是否属于您的要求,但这是我的任务。您不需要使用break monad即可实现所需的功能(除非这是分配的目标?)。

[您可能要考虑使用模式匹配和保护而不是if else块。

© www.soinside.com 2019 - 2024. All rights reserved.