- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Learn You a Haskell使用以下 Prob
类型讨论“制作 Monad”:
import Data.Ratio
newtype Prob a = Prob { getProb :: [(a,Rational)] } deriving Show
Prob
代表一个a
类型,然后是一个Rational
代表这个a
被使用的概率。
让我们看一个 Prob
实例:
*Main> Prob [('a', 1%2), ('b', 1%2)]
Prob {getProb = [('a',1 % 2),('b',1 % 2)]}
LYAH 提出了一个练习来弄清楚如何将类型为 Prob(Prob Char)
的 thisSituation
转换为 Prob Char
:
thisSituation :: Prob (Prob Char)
thisSituation = Prob
[( Prob [('a', 1%2),('b',1%2)], 1%4)
,( Prob [('c', 1%2),('d',1%2)], 3%4)
]
这是我想出的:
flatten :: Prob (Prob a) -> Prob a
flatten pp = Prob $ convert $ getProb pp
convert :: [(Prob a, Rational)] -> [(a, Rational)]
convert xs = concat $ map f xs
f :: (Prob a, Rational) -> [(a, Rational)]
f (p, r) = map (mult r) (getProb p)
mult :: Rational -> (a, Rational) -> (a, Rational)
mult r (x, y) = (x, r*y)
我试过 point-free
是这样的:
flatten :: Prob (Prob a) -> Prob a
flatten = Prob $ convert $ getProb
但是出现了这个错误:
*Main> :l MakingMonad.hs
[1 of 1] Compiling Main ( MakingMonad.hs, interpreted )
MakingMonad.hs:37:11:
Couldn't match expected type `Prob (Prob a) -> Prob a'
with actual type `Prob a0'
In the expression: Prob $ convert $ getProb
In an equation for `flatten': flatten = Prob $ convert $ getProb
MakingMonad.hs:37:28:
Couldn't match expected type `[(Prob a0, Rational)]'
with actual type `Prob a1 -> [(a1, Rational)]'
In the second argument of `($)', namely `getProb'
In the second argument of `($)', namely `convert $ getProb'
In the expression: Prob $ convert $ getProb
Failed, modules loaded: none.
我可以让 flatten
无点吗?如果是这样,请告诉我如何。如果不是,请解释原因。
最佳答案
当你在flatten
中使用$
时,你得到的代码看起来像
flatten = Prob $ convert $ getProb
==> Prob (convert (getProb))
这不是你想要的。
你想要 Prob 。转变 。获取概率
关于haskell - 转换为 Pointfree 风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25593318/
我正在尝试移植以下 Haskell 代码 (http://codepad.org/MMydRCxo) foo :: Int -> Int -> Int -> Maybe Bool foo a b c
好吧,事实证明我在我的程序代码中定义了这个函数: st_zipOp :: (a -> a -> a) -> Stream a -> Stream a -> Stream a st_zipOp f xs
我有一个函数对象: const src = { foo: str => str.toUpperCase(), bar: str => str + str, baz: str => str.
下面的函数createTuple可以表示为pointfree吗? let createTuple = fun v -> (v, v*2) createTuple 2 |> printfn "%A" /
我想编写一个 Haskell 函数,它返回一个附加到自身计数时间的列表(如 Python 中的 lst * count)。 我的第一次尝试是: self_append_n :: Int -> [a]
在 Haskell 中,我定义了一个乘法表生成器函数,如下所示: multTable :: [[Int]] multTable=map (\b -> map (b*) [1..12]) [1..12]
Learn You a Haskell使用以下 Prob 类型讨论“制作 Monad”: import Data.Ratio newtype Prob a = Prob { getProb :: [(
当参数应该散布在柯里化(Currying)组合函数中时,我试图弄清楚是否存在编写无点组合函数的模式 即(使用 Ramda): add_1_and_multiply = (add, mul) => R.
我想知道我是否可以像这样使用 Swift/RxSwift 来使用 pointfree-style: class MyClass { private let ageService: Observa
我一直在重用 lambda 表达式,例如 \x -> (f x, g x) 我将相同的输入应用于两个函数并将结果封装成一对。我可以写一个函数来捕捉这个 combine :: (a -> b) -> (
我有这个功能 rulesApply :: [PhrasePair] -> Phrase -> Phrase rulesApply pp = try (transformationsApply "*"
pointfree 函数可以返回一个元组吗?例如,以下是否可以用 pointfree 风格编写(其中 f1、f2 和 f3 已被定义): (\t -> (f1 t, f2 t, f3 t)) 在这种情
我想定义一个函数来计算列表中满足给定谓词的元素数量: number_of_elements :: (a -> Bool) -> [a] -> Int number_of_elements f
我怎样才能使以下函数成为 pointfree(使用 Ramda)? const prefixAll = R.curry((prefix, list) => R.map(R.concat(prefix)
可以this完成 pointfree 了吗? var joinByKey = R.curry(function(key, model){ return R.assoc(key, R.join(
我有一些谓词,例如: is_divisible_by_13 = lambda i: i % 13 == 0 is_palindrome = lambda x: str(x) == str(x)[::-
我正在以无点风格查看 Haskell 中的一些函数。在尝试重写一些简单的示例时,我卡在了这个上 func a b c d = sum $ take 2 $ sort [a, b, c, d] 如何将参
我在 ramda.js 中编写 pointfree 风格的函数时遇到问题,想知道是否有人可以帮助我。 getEnv 函数读取环境变量,如果找不到,则将其记录到控制台。 这是我的代码 const env
当我尝试以 pointfree 风格编写 JavaScript 时,我发现如果强制每个函数都采用这种风格,有时会失去其可读性。例如: import R from 'ramda' const ceil
鉴于下面的功能,如何将其转换为无点样式?使用 Ramda 的 prop 会很好和 path并跳过数据参数,但我无法弄清楚正确的语法。 const mapToOtherFormat = (data) =
我是一名优秀的程序员,十分优秀!