Haskell-声明/使用数据

Haskell-声明/使用数据,haskell,types,Haskell,Types,这是我第一次在Haskell中使用数据类型。 遇到问题,我不知道如何改进代码 问题是: Declear一个名为Consonant的数据类型,其中包括一些lettersstring,以及一个textstring,它获取有关该单词中所有字母是否为Consonant的信息,然后编写一个函数Cheak,该函数将indata一些字母输入Cheak,并输出数据类型Consonant 这是我的密码: module Consonant where import Char type Name = String

这是我第一次在Haskell中使用数据类型。 遇到问题,我不知道如何改进代码

问题是:

Declear一个名为Consonant的数据类型,其中包括一些lettersstring,以及一个textstring,它获取有关该单词中所有字母是否为Consonant的信息,然后编写一个函数Cheak,该函数将indata一些字母输入Cheak,并输出数据类型Consonant

这是我的密码:

module Consonant where

import Char

type Name = String
type ConOrNot = String
data Consonant = Cons Name ConOrNot
    deriving (Show,Eq)


isVowel = "AEIOU"

cheak :: String -> Consonant

cheak [] = ""
cheak (char:chars) =
if  elem (toUpper char) isVowel  == false
then    cheak chars
else    cheak = Cons (char:chars) "Not Consonant"   
-- here I want to use "break", but I don't know how to use it in Haskell...  

cheak = Cons (char:chars) "Is Consonant"  
它不起作用。。。如何更改代码?请帮忙!谢谢大家!

更新:

   module Consonant where

   import Char

   type Word = String
   type ConOrNot = String
   data Consonant = Cons Word ConOrNot
       deriving (Show,Eq)


   isConsonant = "BCDFGHJKLMNPQRSTVWXYZ"

   cheak :: String -> Consonant

   cheak [] = Cons "" ""


   cheak (char:chars) 
       |elem (toUpper char) isCosonant = cheak chars  --if all the letters are cosonant, I want it return (Cons (char:chars) "is Consonant").. still working on it
       |otherwise              = Cons (char:chars) "Not Consonant"

如果字符串同时包含元音和辅音,或者只包含元音,那么它现在就可以工作了。如何改进代码,使其也只包含辅音?

在Haskell中有很多方法可以实现您想要的功能。显而易见的第一选择是“也许”和“要么”。但是,一般来说,请查看。

在Haskell中,有很多方法可以完成您想要做的事情。显而易见的第一选择是“也许”和“要么”。但总的来说,这是家庭作业,不是吗

代码中的问题包括:

这句话毫无意义:

cheak [] = ""
cheak = Cons (seq:seqs) "Is Consonant"
因为cheak应该返回一个辅音,但这里您返回一个字符串

这句话也毫无意义:

cheak [] = ""
cheak = Cons (seq:seqs) "Is Consonant"
因为cheak应该接受一个字符串参数并返回一个辅音,但这里您只返回一个辅音而不接受任何参数

这句话就更没道理了:

else    cheak = Cons (seq:seqs) "Not Consonant"
Haskell不是Pascal或Visual Basic。通过让方程的RHS求值为该值,可以从函数返回一个值

缩进很重要

Haskell中有一个名为break的函数,但它与您可能熟悉的Java或C中的break关键字无关。Haskell中不存在打破循环的Java/C概念

您可能想要使用一个helper函数

切克不是一个词

如果那么else不是一个语句。then分支和else分支也不是语句。它们都是表情。就像?:来自Java、C和其他一些语言


这是家庭作业,不是吗

代码中的问题包括:

这句话毫无意义:

cheak [] = ""
cheak = Cons (seq:seqs) "Is Consonant"
因为cheak应该返回一个辅音,但这里您返回一个字符串

这句话也毫无意义:

cheak [] = ""
cheak = Cons (seq:seqs) "Is Consonant"
因为cheak应该接受一个字符串参数并返回一个辅音,但这里您只返回一个辅音而不接受任何参数

这句话就更没道理了:

else    cheak = Cons (seq:seqs) "Not Consonant"
Haskell不是Pascal或Visual Basic。通过让方程的RHS求值为该值,可以从函数返回一个值

缩进很重要

Haskell中有一个名为break的函数,但它与您可能熟悉的Java或C中的break关键字无关。Haskell中不存在打破循环的Java/C概念

您可能想要使用一个helper函数

切克不是一个词

如果那么else不是一个语句。then分支和else分支也不是语句。它们都是表情。就像?:来自Java、C和其他一些语言


我不完全确定你要什么。返回的Cons中的单词应该是传递给cheak的单词,还是从第一个元音开始的单词的剩余部分

这是你想要的吗

module Consonant
    where

import Data.Char

type Word = String
type ConOrNot = String
data Consonant = Cons Word ConOrNot
                 deriving (Show,Eq)

cheak :: Word -> Consonant
cheak "" = Cons "" ""
cheak s = Cons s $ if any isVowel s then "Not Consonant" else "is Consonant"
          where isVowel c = (toUpper c) `elem` "AEIOU"

我不完全确定你要什么。返回的Cons中的单词应该是传递给cheak的单词,还是从第一个元音开始的单词的剩余部分

这是你想要的吗

module Consonant
    where

import Data.Char

type Word = String
type ConOrNot = String
data Consonant = Cons Word ConOrNot
                 deriving (Show,Eq)

cheak :: Word -> Consonant
cheak "" = Cons "" ""
cheak s = Cons s $ if any isVowel s then "Not Consonant" else "is Consonant"
          where isVowel c = (toUpper c) `elem` "AEIOU"

这正是我想要的。谢谢你的帮助,这正是我想要的。谢谢你的帮助。