我在使用时以及何时不在我的代码中使用类型类时遇到一些困难.我的意思是 创建我自己的,当然不是使用已定义的类型类.通过示例(非常愚蠢的例子),我应该这样做:
data Cars = Brakes | Wheels | Engine
data Computers = Processor | RAM | HardDrive
class Repairable a where
is_reparaible :: a -> Bool
instance Repairable Cars where
is_repairable (Brakes) = True
is_repairable (Wheels) = False
is_repairable (Engine) = False
instance Repairable Computers where
is_repairable (Processor) = False
is_repairable (RAM) = False
is_repairable (HardDrive) = True
checkState :: (Reparaible a) => a -> ...
checkState a = ...
Run Code Online (Sandbox Code Playgroud)
(显然,这是一个愚蠢的,不完整的例子).
但这有点用处,不是吗?为什么我不应该做一些简单的事情而只定义函数而不定义新的数据类型和类型类(带有它们的实例).
这个例子太简单了,但事实上,当我在github上浏览Haskell代码而不是仅定义函数时,我常常会看到类似的东西(新数据类型+类型类+实例).
那么,当我应该创建新的数据类型,类型类等时,我应该何时使用函数?
谢谢.
所以,我有一个非常简单的函数,它有两个参数:第一个是小时(0到23之间),第二个是一分钟(0到59之间).此功能返回小时加一分钟,并以美丽的风格格式化小时.例如,hour 11 12返回11 heures et 13 minutes.对不起,小时的法语格式.
所以,我在这个函数中使用了show函数,而参数需要是一个数字,所以我有类型声明(Num a, Show a) => a -> a -> String.但是,当我尝试该函数时,我得到一个错误,GHC告诉我添加Eq类型约束,但我不明白为什么Eq在这种情况下我需要类型约束.有代码(再次,对于函数中使用的法语文本感到遗憾,但我认为如果你不理解函数名和文本,这不是很重要):
heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59 = show (h+1) ++ " heures"
heure h m = show h ++ " heures et …Run Code Online (Sandbox Code Playgroud) 是否可以在我们的OWN模块中使用GHCI中的"import qualified"等价物?某些东西:m + qualified Data.List当然不起作用.
谢谢.
我实际上使用Python和Flask作为我的devblog.我知道根据语言的不同,建议在else非强制性时使用显式,但我不知道它在Python中是如何工作的.
例如,我有一个函数,if如果语句为真,则返回一些东西.所以,else没有必要,因为有或没有它,执行继续正常.
def foo(bar):
if not isinstance(foo, list):
return "an error"
else: # not necessary
return "something"
Run Code Online (Sandbox Code Playgroud)
所以,我应该像这样使用它,或者像:
def foo(bar):
if not isinstance(foo, list):
return "an error"
return "something"
Run Code Online (Sandbox Code Playgroud) 我尝试reverse使用Maybe. 我不知道如何Just使用递归返回模式匹配。例如,ghci> myReverse [1,2,3]需要返回Just [3,2,1]. 这是我的代码:
myReverse :: [a] -> Maybe [a]
myReverse [] = Nothing
myReverse [x] = Just [x]
myReverse (x:xs) = myReverse xs ++ [x] -- here's my problem.
Run Code Online (Sandbox Code Playgroud)
我认为那myReverse (x:xs) = Just $ myReverse xs ++ [x]行得通,但没有,我不知道该怎么做。我想知道的是如何做到这一点以及为什么这样做。
谢谢你的帮助!
我想知道一个列表是否只包含一个元素,而不使用len.
在这两种解决方案之间,最pythonic的方法是什么?或者也许这些都不是pythonic,如果是,那又是什么?
解决方案 a:删除位置 1 处的项目,除了 an,IndexError所以我知道只有 1 个项目。
try:
a_list.pop(1):
except IndexError:
#blah
Run Code Online (Sandbox Code Playgroud)
解决方案b:使用切片删除第一个元素并检查列表现在是否为空
if not a_list[1:]:
# blah
Run Code Online (Sandbox Code Playgroud)