小编Pet*_*lys的帖子

在 Haskell 中只允许不同的“任何”类型

假设我们有一个带签名的函数

foo :: a -> b -> Int
Run Code Online (Sandbox Code Playgroud)

是否可以强制执行约束以确保ab不同?那是

foo :: Int -> String -> Int -- ok
foo :: Int -> Int    -> Int -- not ok
Run Code Online (Sandbox Code Playgroud)

这个问题的目的是了解有关 Haskell 的更多信息,并可能解决我面临的设计问题。如果 a == b,我的特殊情况没有意义,所以我想在编译器级别禁止它。我可能可以通过完全不同的设计让这个问题消失,但这不是现在的重点 - 潘多拉盒子已经打开,我想了解是否可以在类型级别上进行相等约束。

haskell

12
推荐指数
2
解决办法
507
查看次数

详尽的Haskell模式匹配的性能

我想知道如何在内部解决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个模式匹配?

performance haskell pattern-matching

7
推荐指数
1
解决办法
286
查看次数

Haskell的Double绑定实例

Prelude不提供Bounded Double实例。这是因为Double在Haskell中(绑定要求)没有min / max参数,还是原因不同?

haskell

6
推荐指数
1
解决办法
101
查看次数

生成 Haskell 模块依赖树

有没有办法可以生成(和查看)我的 Haskell 项目的模块依赖关系树?我已经看过此类图表的图像,但无法弄清楚如何做到这一点。

haskell

5
推荐指数
1
解决办法
421
查看次数

哈斯克尔| 为事物分配多个值,以便将它们作为单个参数传递给函数

是否可以通过以下方式"分配"并在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)

这个问题出于好奇而没有任何实际原因.

haskell

3
推荐指数
1
解决办法
186
查看次数

哈斯克尔| 无法从上下文中推断出来

我有这个不编译的代码.我想明白为什么它不能推断出类型.

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)

haskell

3
推荐指数
1
解决办法
144
查看次数

哈斯克尔| 让表达式重新计算?

让我们说我们有这个功能:

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的范围?

haskell let

2
推荐指数
1
解决办法
196
查看次数

Haskell中的多态数据族

我想定义一个支持显式未实例化情况的多态的数据系列:

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

2
推荐指数
1
解决办法
68
查看次数

Haskell中缀符号左侧有2个参数

在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)

haskell infix-notation

1
推荐指数
1
解决办法
86
查看次数