假设我们有一个带签名的函数
foo :: a -> b -> Int
Run Code Online (Sandbox Code Playgroud)
是否可以强制执行约束以确保a和b不同?那是
foo :: Int -> String -> Int -- ok
foo :: Int -> Int -> Int -- not ok
Run Code Online (Sandbox Code Playgroud)
这个问题的目的是了解有关 Haskell 的更多信息,并可能解决我面临的设计问题。如果 a == b,我的特殊情况没有意义,所以我想在编译器级别禁止它。我可能可以通过完全不同的设计让这个问题消失,但这不是现在的重点 - 潘多拉盒子已经打开,我想了解是否可以在类型级别上进行相等约束。
我想知道如何在内部解决Haskell模式匹配以及它如何影响性能.假设我们有一个计算成本很高的函数,所以我们在进行实际计算之前预先计算第一个和/或更频繁使用的值和相应输入上的模式匹配:
expensiveComputation :: Int -> Int
expensiveComputation 1 = 101
expensiveComputation 2 = 3333333
expensiveComputation 3 = 42
...
expensiveComputation n = the actual function
Run Code Online (Sandbox Code Playgroud)
如果我们想要的话,我们可以预先计算很多这些案例,但是我们呢?我假设Haskell实际上找到匹配输入的模式需要时间,所以也许它实际上更快计算第1000个值而不是1000个模式匹配?
Prelude不提供Bounded Double实例。这是因为Double在Haskell中(绑定要求)没有min / max参数,还是原因不同?
有没有办法可以生成(和查看)我的 Haskell 项目的模块依赖关系树?我已经看过此类图表的图像,但无法弄清楚如何做到这一点。
是否可以通过以下方式"分配"并在Haskell中传递值:
foo :: Int -> Int -> Int
foo x y = x + y
bar :: ??
bar = 2 3 -- ??
foo bar == 5
Run Code Online (Sandbox Code Playgroud)
Foo是一个需要两个整数的函数.我想将这些int分配给一个bar并将该bar传递给foo,以便它可以产生它的结果.我想实现这一点,而不使用像这样的元组,新类型或值分离:
bar1 = 2
bar2 = 3
foo bar1 bar2 == 5
Run Code Online (Sandbox Code Playgroud)
这个问题出于好奇而没有任何实际原因.
我有这个不编译的代码.我想明白为什么它不能推断出类型.
module Main where
data Combiner a = Combiner a (a -> Int)
comb = Combiner 3 (\x -> 5)
class HasValue a where
getValue :: Int
instance HasValue Combiner where
getValue (Combiner x f) = f x
main = print $ getValue comb
Run Code Online (Sandbox Code Playgroud)
这是错误:
main.hs:8:3: error:
• Could not deduce (HasValue a0)
from the context: HasValue a
bound by the type signature for:
getValue :: HasValue a => Int
at main.hs:8:3-17
The type variable ‘a0’ is ambiguous
• In …Run Code Online (Sandbox Code Playgroud) 让我们说我们有这个功能:
foo n = let comp n = n * n * n + 10
otherComp n = (comp n) + (comp n)
in (otherComp n) + (otherComp n)
Run Code Online (Sandbox Code Playgroud)
comp实际执行了多少次?1还是4?Haskell"存储"函数是否导致let的范围?
我想定义一个支持显式未实例化情况的多态的数据系列:
data family Foo a
-- handles some specific case
data instance Foo Int = CreateInt Int Int String
-- handles all other cases
data instance Foo bar = CreateBar bar
Run Code Online (Sandbox Code Playgroud)
这可能吗?
在Haskell中,中缀表示法允许我们执行以下操作:
divide :: Double -> Double -> Double
divide x y = x / y
foo = divide 10.0 3.0
bar = 10.0 `divide` 3.0 -- infix
-- foo and bar are equivalent
Run Code Online (Sandbox Code Playgroud)
是否可以使用/ define中缀表示法,左边有2个参数?
sumAndDivideBy :: Double -> Double -> Double -> Double
sumAndDivideBy x y z = (x + y) / z
foo2 = sumAndDivideBy 3.0 5.0 2.0
bar2 = 3.0 `sumAndDivideBy` 5.0 $ 2.0 -- works but not what I wan't
bar3 = 3.0 5.0 `sumAndDivideBy` 2.0 …Run Code Online (Sandbox Code Playgroud)