Questions tagged «haskell»

Haskell是一种功能性编程语言,具有强大的静态类型,惰性评估,广泛的并行性和并发支持以及独特的抽象功能。

1
Haskell中平行的“任何”或“全部”
我现在遇到过一种模式,该模式需要通过在其上映射一些测试并查看是否有任何或所有元素通过来检查值列表。典型的解决方案是使用便捷的内置all和any。 问题是这些以串行方式进行评估。在许多情况下,这将是多快平行的过程被完整的评估,一旦任何线程发现一个“假”的all或“真”的any。我很确定不能使用Control.Parallel来实现短路行为,因为它需要进程间的通信,而且我对Control.Concurrent的理解还不够,无法实现此目的。 这是数学中的一种很常见的模式(例如Miller-Rabin Primality),所以我觉得有人可能已经为此提出了解决方案,但是出于明显的原因,谷歌搜索了“平行或/和//任何/全部在列表中” haskell”不会返回许多相关结果。

1
Haskells弱头范式
我偶然发现了一些令人讨厌的东西。我知道haskell可用于弱头正常形式(WHNF),而且我知道这是什么。将以下代码键入ghci(据我所知,我正在使用命令:sprint,将表达式简化为WHNF): let intlist = [[1,2],[2,3]] :sprint intlist 给intlist = _这使得完全意义的我。 let stringlist = ["hi","there"] :sprint stringlist 给stringlist = [_,_] 这已经使我感到困惑。但是之后: let charlist = [['h','i'], ['t','h','e','r','e']] :sprint charlist 令人惊讶地给 charlist = ["hi","there"] 据我了解,Haskell,字符串不过是字符列表,这似乎可以通过检查类型"hi" :: [Char]和来确认['h','i'] :: [Char]。 我感到困惑,因为根据我的理解,以上所有三个示例大致相同(列表列表),因此应简化为相同的WHNF,即_。我想念什么? 谢谢

1
mono-traversable中的“ concatMap”如何能够“抽取”常见的论点?
当我偶然发现这种行为时,我正在学习Haskell,并且正在为Yesod做一个简单的DB种子程序,这种行为我很难理解: testFn :: Int -> Bool -> [Int] testFn a b = if b then replicate 10 a else [] Yesod GHCI会议: $ :t concatMap testFn [3] concatMap testFn [3] :: Bool -> [Int] $ (concatMap testFn [1,2,3]) True [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3] 它以某种方式能够将每个映射中的第二个“布尔”“拉出”到一个单独的咖喱参数中。 标准基础Prelude GHCI会话甚至拒绝编译此表达式: $ :t concatMap testFn [3] error: • …

5
如何在不重复自己的情况下使该算法变得更懒惰?
(受到我对这个问题的回答的启发。) 考虑下面的代码(它应该找到小于或等于给定输入的最大元素): data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord) closestLess :: Integer -> TreeMap v -> Maybe (Integer, v) closestLess i = precise Nothing where precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v) precise closestSoFar …

2
哈斯克尔的嵌套国家
我正在尝试定义状态机家族,它们的状态有些不同。特别地,更“复杂”的状态机具有通过组合更简单的状态机的状态而形成的状态。 (这类似于面向对象的设置,其中对象具有多个属性,这些属性也是对象。) 这是我要实现的简化示例。 data InnerState = MkInnerState { _innerVal :: Int } data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState } innerStateFoo :: Monad m => StateT InnerState m Int innerStateFoo = do i <- _innerVal <$> get put $ MkInnerState (i + 1) return i outerStateFoo …

2
总和类型-为什么在Haskell中show(Int | Double)与`(show Int)|不同?(显示双)`
为什么这些不相等? show $ if someCondition then someInt else some double 和 if someCondition then show someInt else show someDouble 我了解,如果您将if ... else第一个示例中的部分本身与一个表达式隔离开,那么您就无法用匿名和类型来表示其类型Int | Double,就像您可以在TypeScript中轻松进行的操作(提及TypeScript,因为它是我经常使用的语言,该语言支持Sum类型),因此必须诉诸使用Either数据,然后再基于调用show。 我在这里给出的示例很简单,但对我来说,认为“好吧,我们将要显示某些东西,而某些东西取决于someCondition”,而不是“好吧,如果someCondition为true,则显示someInt,否则显示someDouble”,并且也允许减少代码重复(此处的显示重复了两次,但它也可能是一个长函数的应用程序,而不是if ... else可能要考虑的> 2个分支) 在我看来,对于编译器而言,检查构成求和类型的每种类型(在此处Int | Double)是否可以用作show函数的参数并确定类型是否正确应该很容易。更好的是,无论参数的类型如何,show函数总是会返回string,因此编译器不必随身携带所有可能的“分支”(因此所有可能的类型)。 是否选择不存在这样的功能?还是我认为实施起来更加困难?

1
用cont无法完成的callCC我该怎么办?
我真的很难理解callCC。我拥有Continuations的力量,并且在我的一些项目中一直在使用该概念来创建很酷的概念。但是我从来没有必要使用功能比cont :: ((a->r)->r)-> Cont r a。 在使用它之后,很有意义,为什么他们将Cont Monad称为所有Monad的母亲,是的,我不知道何时需要使用callCC,这正是我的问题。

1
如何控制尺度不变性?
我试图将几种图表放到一张桌子中。我认为这被称为“索引打印”,摄影人员在必须一次查看许多照片时会这样做。无论如何,这是代码: main :: IO () main = mainWith @(Diagram B) $ (tile . fmap renderOne) examples renderOne :: AnyGraph -> Diagram B renderOne (AnyGraph gr) = ... tile :: [Diagram B] -> Diagram B tile xs = let columns = (ceiling . sqrt . fromIntegral . length) xs in (vcat …

3
某人写下这样的foldlM定义需要什么知识或培训?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 7个月前关闭。 最近,我试图在我的一些实际案例制作系统中使用Haskell。Haskell类型系统确实为我提供了很大的帮助。例如,当我意识到我需要某种类型的功能时 f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b 实际上有类似的功能foldM,foldlM和foldrM。 但是,真正令我震惊的是这些功能的定义,例如: foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM f …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.