从Learn-you-a-haskell学习一个例子,"对于所有边和所有边都等于或小于10的直角三角形的周长为24?"
rightTrianglesOriginal = [(a,b,c)| c < - [1..10],b < - [1..10],a < - [1..10],a ^ 2 + b ^ 2 == c ^ 2,a + b + c == 24]
我更改了原始示例的部分,并希望了解下面的过程(在极端条件下).
谓词的顺序会影响性能吗?
添加谓词(其他谓词暗示)是否会影响性能?(例如a> b,c> a,c> b?)?
根据谓词(1)a> b和(2)c> a制作元组列表,然后进一步应用^ 2 + b ^ 2 = c ^ 2将提高整体性能?
如果我们改变参数位置,例如(a,b,c)或(c,b,a),会对性能产生影响吗?
如果需要这样大量的排列和组合,现实生活中应用的策略是什么?我们是否应该为下次使用存储预先计算的答案(尽可能)以提高性能或其他任何性能?
rightTriangles = [(a,b,c)| c < - [1..10],b < - [1..10],a < - [1..10],a ^ 2 + b ^ 2 == c ^ 2]
几乎在很短的时间内给出结果.
rightTriangles10 = [(a,b,c)| c < - …
下面给出的代码编译,好的.
data Car p q r = Car {company :: p
, model :: q
, year ::r
} deriving (Show)
tellCar :: (Show a) => Car String String a -> String
Run Code Online (Sandbox Code Playgroud)
什么是基本原则/惯例/逻辑可以提醒我,我只需要在'tellCar'中"显示",而不是任何其他选项?我在哪里可以找到资源来学习这些原则/惯例/逻辑?
如果我错误地在tellCar中使用'Show Car',则会在编译时收到以下错误消息:
*Main> :load "/home/optimight/baby.hs"
[1 of 1] Compiling Main ( /home/optimight/baby.hs, interpreted )
/home/optimight/baby.hs:96:18:
Expecting three more arguments to `Car'
In the type signature for `tellCar':
tellCar :: Show Car => Car String String a -> String
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
如果我错误地在tellCar中使用'Show z',则在编译时收到以下错误消息:
*Main> :load "/home/optimight/baby.hs" …Run Code Online (Sandbox Code Playgroud) scala> class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length); def getWidth ():Int = println (Width); }
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = println (Width:Int); }
^
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = …Run Code Online (Sandbox Code Playgroud) 以下是我转载的例子:
charName :: Char - > String
charName'a'="Albert"
charName'b'="Broseph"
charName'c'="Cecil"
charName x ="尚未定义"
我可以进一步修改上面提到的代码,如下所示(不会编译):
charName :: Char - > String
charName'a'或'A'="Albert"
charName'b'或'B'="Broseph"
charName'c'或'C'="Cecil"
charName x或X ="Not定义了"
如果给出charName'a'或charName'A',则获取"Albert".
请指导如何以最短的方式编写上述代码.
如果必须设置约束,则创建的任何圆的半径必须大于零(半径> 0).怎么做?
data Point = Point Float Float deriving (Show)
data Radius = Radius Float deriving (Show)
data Shape = Circle Point Radius deriving (Show)
surface :: Shape -> Float
surface (Circle _ (Radius r)) = pi * r ^ 2
Run Code Online (Sandbox Code Playgroud)
如果方便,请提供更多示例,说明如何在各种情况下设置约束/验证.例如,数据电话可以具有正则表达式或特定的起始编号集(区号或国家代码等).
.hs代码:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
} deriving (Eq, Show, Read)
Run Code Online (Sandbox Code Playgroud)
编译:
*Main> :load "/home/optimight/baby.hs"
[1 of 1] Compiling Main ( /home/optimight/baby.hs, interpreted )
Ok, modules loaded: Main.
Run Code Online (Sandbox Code Playgroud)
在编译后立即测试:
*Main> read "Person {firstName = \"Michael\", lastName \"Diamond\", age = 43}" :: Person
*** Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)
请指导.为什么会出现此错误以及如何避免此类错误?