【问题标题】:Haskell check integer first element to process an ID numberHaskell 检查整数第一个元素以处理 ID 号
【发布时间】:2021-03-30 13:11:46
【问题描述】:

我是haskell的新手! 我需要编写一个处理 ID 号的函数。我需要检查整数的第一位。如果数字是 1 或 3,那么客户是男性,如果数字是 2 或 4,那么客户是女性。我想我需要一个辅助函数,它将长整数拆分为整数列表。 函数名为 szemelyinem,它有一个参数/参数,是一个 11 长整数。

这是分割函数:

split :: Integral x => x -> [x]      
split 0 = []
split x = split (x `div` 10) ++ [x `mod` 10]

在我的脑海中,概念是拆分长数字,然后将其加载到函数中,然后检查列表中的第一个元素并返回一个字符串。但我不知道如何开始这个:/

我有一个这样的例子:

szemelyinem 40504291247
Result: "female"

【问题讨论】:

  • 你能写一个函数,比如foo,将Integer 数字转换成数字列表吗?
  • 在这种情况下,我认为您不需要通用 Integrals - 我什至认为您不需要将其拆分为 Ints 的列表 - 你能写你的函数吗如果您有Chars 的列表?您知道任何可以将您的号码变成列表或Char 的功能吗? (提示:String = [Char]
  • 另一个提示:您可以使用head 或(更喜欢)通过对firstEl : restEl 模式使用模式匹配从列表中获取第一个元素的模式
  • 老实说,并非如此。顺便说一句,这是一个家庭作业,但我的老师向我们展示了一些基本的东西。所以此刻我很难过。在 java 或 C++ 中,这将是一个 5 分钟的任务,但在 Haskell 中,到目前为止这是一场噩梦。
  • ID 是否总是 11 位数字?如果是这样,你可以只除以 10^10 就完成了吗?

标签: list haskell


【解决方案1】:

这是第一步。

split :: Integral x => x -> [x]
split 0 = []
split x = split (x `div` 10) ++ [x `mod` 10]

这是第二个。

rev:: [Integer] -> [Integer]
rev [] = []
rev (h:t) = rev t ++ [h]

这是第三步

nemdel :: [Integer] -> [Integer]          
nemdel  [] = []
nemdel (h:t) = drop 10 (h:t)

这是第四个。

listtonumb:: [Integer] -> Integer
listtonumb = foldl addDigit 0
   where addDigit num d = 10*num + d

还有最后一个。

szemelyinem :: Integer -> [Char]
szemelyinem szam =
    if listtonumb(nemdel(rev(split szam)))  == 1 || listtonumb(nemdel(rev(split szam))) == 3
         then "male"
    else if listtonumb(nemdel(rev(split szam))) == 2 || listtonumb(nemdel(rev(split szam))) == 4
         then "Female"
         else error "Bad ID"

我敢肯定这是一种复杂的方法来做这件事。

【讨论】:

  • 一些 cmets:nemdel 可以只是 nemdel = drop 10 ,如果你使用 split x = (x `mod` 10) : split (x `div` 10),则不需要 rev,你可能想要引入一个本地绑定,如 let n = listtonumb(nemdel(rev(split szam))) in ...所以你不必一次又一次地重写长表达式,我会使用String而不是[Char](但它是同义词,所以没关系)
  • 也可以代替droping 10,您可以保留split 函数并改用take 1 ;) - 如果您已经拥有(h:t) 模式,只需返回[h]; )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2017-04-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多