小编dav*_*420的帖子

我怎样才能知道monad是否可交换?

Control.Monad.List.ListT的文档声明它"除非参数monad是可交换的,否则不会产生monad".

  1. 我怎样才能知道monad是否可交换?是否存在CommutativeMonad类型类?应该有吗?

  2. 特别是,Control.Monad.RWS.Lazy.RWS是一个可交换的monad?

monads haskell commutativity

18
推荐指数
2
解决办法
1292
查看次数

如何将Kleisli合成与返回Validations的函数一起使用?

如何组合返回Validations的两个函数?以下是我的尝试不起作用:

scala> def f: Int => Validation[String, Int] = i => if(i % 2 == 0) Success(i * 2) else Failure("Odd!")
f: Int => scalaz.Validation[String,Int]

scala> def g: Int => Validation[String, Int] = i => if(i > 0) Success(i + 1) else Failure("Not positive!")
g: Int => scalaz.Validation[String,Int]

scala> kleisli(f) >=> kleisli(g)
<console>:16: error: no type parameters for method kleisli: (f: A => M[B])scalaz.Kleisli[M,A,B] exist so that it can be applied to arguments (Int => scalaz.Validation[String,Int])
 --- because ---
argument …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala scalaz

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

Haskell - sortBy函数

我有一个矢量列表.但现在我想使用sortBy函数按照它们的长度对这个向量列表进行排序.我已经是:

import Data.List

vectorLength::(Int,Int)->Float
vectorLength(x,y) = sqrt(fromIntegral ((x^2)+(y^2)))

sortVectors::[(Int, Int)]->[(Int, Int)]
sortVectors list = sortBy(map vectorLength list) list

main = do
    print(map vectorLength [(1,4), (2,6), (-2, -8), (3, -4)])
    print(sortVectors[(1,4), (2,6), (-2,-8), (3, -4)])
Run Code Online (Sandbox Code Playgroud)

vectorLength函数确实有效.

map vectorLength [(1,4), (2,6), (-2,-8),(3,-4)]   
output: [4.1231055, 6.3245554, 8.246211, 5.0]
Run Code Online (Sandbox Code Playgroud)

我想在调用以下函数时

sortVectors [(1,4), (2,6), (-2,-8), (3,-4)]  
output: [(-2,-8), (2,6), (3,-4), (1,4)]
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

Couldn't match expected type `(Int, Int)' with actual type `[a0]'
    Expected type: (Int, Int) -> (Int, Int) -> Ordering
      Actual type: [a0] -> …
Run Code Online (Sandbox Code Playgroud)

haskell

13
推荐指数
2
解决办法
7157
查看次数

这种幂等概括的名称是什么?

许多常用的函数属性都有简洁的名称.例如,关联性,交换性,传递性等.

我正在创建一个与QuickCheck一起使用的库,它提供了这些属性和其他属性的简写定义.

我有一个问题的是一元函数的幂等性.函数f是幂等的iif∀x.fx == f(fx).

这个属性有一个有趣的概括,我正在努力寻找一个类似的简洁名称.为了避免通过建议选择偏向于人们的姓名选择,我将其命名为P并提供以下定义:

函数f具有关于giif∀x的P属性.fx == f(gx).我们可以通过用P来重新定义幂等性来看待这是幂等性的概括.函数f是幂等的,如果它具有关于它自身的P属性.

要看到这是一个有用的属性,请注意它可以证明可以用来实现许多常见优化的重写规则.当g是某种规范化函数时,这通常但不总是出现.一些例子:

你会怎么称呼这家酒店?

optimization haskell naming quickcheck

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

哈斯克尔:monadic takeWhile?

我有一些用C语言编写的函数,我从Haskell调用.这些功能返回IO (CInt).有时我想运行所有函数,无论它们返回什么,这很容易.为了示例代码,这是当前正在发生的事情的一般概念:

Prelude> let f x = print x >> return x
Prelude> mapM_ f [0..5]
0
1
2
3
4
5
Prelude>
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的副作用,我不关心结果.但是现在我需要在第一个没有返回我想要的结果的项目之后立即停止执行.假设返回值为4或更高要求执行停止 - 那么我想要做的是:

Prelude> takeWhile (<4) $ mapM f [0..5]
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

<interactive>:1:22:
    Couldn't match expected type `[b]' against inferred type `IO a'
    In the first argument of `mapM', namely `f'
    In the second argument of `($)', namely `mapM f ([0 .. 5])'
    In the expression: takeWhile (< 4) $ mapM f ([0 …

monads haskell chaining

12
推荐指数
4
解决办法
2923
查看次数

适用(和朋友)方法是否有人性化的名称?

我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:

  • <*> - 申请?
  • <*&*>- 左右适用?
  • <$> - fmap?
  • <|>

同样来自箭头

  • *** - 分裂?
  • &&& - 扇出?

如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.

haskell naming applicative

9
推荐指数
3
解决办法
510
查看次数

比较列表长度

我有一份清单,让我们说:

import Data.List

xs = [[1,2], [1,2,3], [2,3]]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想获得包含最多项目的内部列表[1,2,3].

我试图使用maximumBy功能从Data.List库:

maximumBy (compare `on` length) xs
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误: not in scope 'on'

任何人都可以告诉我出了什么问题,或者你有更好的方法来获取清单吗?

haskell list

9
推荐指数
2
解决办法
6231
查看次数

haskell-problem:io string - > [int]

你好伟大的程序员在那里,

我正在使用haskell的第一步,并且有一个令我困惑的功能:

import Data.List.Split
getncheck_guesslist = do
    line <- getLine
    let tmp = splitOneOf ",;" line
    map read tmp::[Int]
Run Code Online (Sandbox Code Playgroud)

splitOneOf在Data.List.Split中(我用cabal安装拆分安装它) splitOneOf :: (Eq a)=> [a]->[a]->[[a]]

从错误我得到它有一些类型不正确 - 但不知道如何解决这个冲突,因为IO对我来说仍然是一个谜

我想读取用逗号或分号分隔的整数输入,并得到一个整数列表,这样:

  • 如何检查用户输入是否为Int类型
  • 如何将"IO String"类型的输入"转换"为[Int]

提前感谢您的想法和提示 - 您的ε/ 2

string io int haskell

8
推荐指数
3
解决办法
7419
查看次数

如何在Joda-Time时间戳中保留时区?

我正在解析时间戳.当我读到它们时,它们被迫到我当地的时区(欧洲/伦敦).我想保留原来的时区偏移.

scala> val fmt = org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis()

scala> val t = fmt parseDateTime ("2012-04-16T23:00:45-04:00")
t: org.joda.time.DateTime = 2012-04-17T04:00:45.000+01:00

scala> t.getDayOfMonth
res2: Int = 17

scala> fmt print t
res1: java.lang.String = 2012-04-17T04:00:45+01:00
Run Code Online (Sandbox Code Playgroud)

在这个例子中,来自America/New_York的时间戳被强制到欧洲/伦敦.当我将DateTime转换回String时,我希望找回我输入的原始字符串.

另外,当我问时间戳它的月份是哪一天时,我希望它说是从16日开始(因为这是它生成的地方的日期),而不是第17天(尽管那是日期是什么)在同一时刻的我的时区).

我该怎么做呢?

java timezone scala jodatime

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

为什么这个简单的文本分析程序如此之慢?

这是我计算行数和单词的代码:

import System.IO
import Data.List
main = do
        hSetBinaryMode stdin True
        interact $ (\(w,l)->"line:"++(show l)++"\nwords:"++(show w)++"\n")
                   . foldl' (\(w,l) r-> w `seq` l `seq` (w+length r ,succ l) ) (0,0)
                   . lines
Run Code Online (Sandbox Code Playgroud)

这大约需要10秒才能在大约100兆字节的文件上运行.我将它与Lua(9s),awk(20s)和wc -l -c(0.6s)中的类似程序进行了比较.

为什么这段代码这么慢?可能是什么问题呢?

haskell

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