Function 在haskell中优雅地定义许多函数值

Function 在haskell中优雅地定义许多函数值,function,haskell,Function,Haskell,我想定义一个将所有小写字母大写的函数: yell :: Char -> Char yell 'a' = 'A' yell 'b' = 'B' ... yell 'z' = 'Z' yell ch = ch 最好的方法是什么?我可以通过zip['a'..'z']['a'..'z']列出相应的输入和输出对,但我不知道如何将其转化为yell的定义 我知道lookup是一种选择,但我必须进一步考虑也许,我想知道是否有更基本的东西可用。你可以使用一个防护装置,并利用,例如: import Data

我想定义一个将所有小写字母大写的函数:

yell :: Char -> Char
yell 'a' = 'A'
yell 'b' = 'B'
...
yell 'z' = 'Z'
yell ch = ch
最好的方法是什么?我可以通过
zip['a'..'z']['a'..'z']
列出相应的输入和输出对,但我不知道如何将其转化为
yell
的定义


我知道
lookup
是一种选择,但我必须进一步考虑
也许
,我想知道是否有更基本的东西可用。

你可以使用一个防护装置,并利用,例如:

import Data.Char(toUpper)

yell :: Char -> Char
yell c
    | 'a' <= c && c <= 'z' = toUpper c
    | otherwise = c

yell c |“a”您必须在
lookup
中使用
Maybe
的原因是输入可能不在列表中。“查找此项,如果它不在输入列表中,请别管它”这不是一件非常基本的事情,特别是因为函数通常具有不同的输入和输出类型。不管怎么说,用maybe进行fuzzing一点也不难:
yell ch=fromMaybe ch(lookup ch(zip['a'..'z']['a'..'z'])
如果使用递归编写自己的
lookup
版本听起来还不太常规和无聊,我建议将其作为一个有指导意义的练习非常感谢。也许我可以把我的问题说得更清楚,但我仍然有兴趣知道如何使用成对列表定义许多函数值。我想给出一个具体的例子来处理,但可能是因为它涉及的字符太具体了,我感兴趣的部分被扫到了答案中的
toUpper
下面。@Diffycue然后你应该编辑你的问题,以得到一个内置函数还没有做过的例子。@Diffycue:这是一个包含多个unicode范围的多个规则。我确信它不是一个查找表,因为大约有1000个字符具有不同的大写变体,因此它会变得相当大。但无论如何,我举了一个例子,比如如何使用
HashMap
执行查找。我认为,使用2元组列表效率会很低(可能不适用于
a
-
z
,但如果您想映射更多的数据,则肯定如此)。@JosephSible感谢您的建议,但它很可能只是部分实现,因为当我知道内置Haskell模块的完整功能目录时,我会问一些与现在不同的问题。尽管图珀的存在,威廉还是提供了一个非常明确的解决方案。
import Data.HashMap.Strict(HashMap, fromList)
import qualified Data.HashMap.Strict as HM

items :: HashMap Char Char
items = fromList (zip ['a' .. 'z'] ['A' .. 'Z'])

yell :: Char -> Char
yell c
    | Just y <- HM.lookup c items = y
    | otherwise = c